首页 > 解决方案 > 具有空值的复合键的 JPA 保存方法

问题描述

@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class ParentId1 implements Serializable {

    private String id1;
    private String id2;

}


@Entity
@IdClass(ParentId1.class)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Parent1 {
    
    @Id @Column(name = "PARENT_ID1")
    private String id1;

    @Id @Column(name = "PARENT_ID2")
    private String id2;

}

@Test
@Transactional
// Test pass
public void compositeKeyTest1(){
    String parentIdStr1 = "parentIdStr1";

    Parent1 parent1 = new Parent1();
    parent1.setId1(parentIdStr1);
    parent1.setId2(null);
    nonIdentifyingIdClassParent1Repo.save(parent1);
}

@Test
// Test fail
public void compositeKeyTest2(){
    String parentIdStr1 = "parentIdStr1";

    Parent1 parent1 = new Parent1();
    parent1.setId1(parentIdStr1);
    parent1.setId2(null);
    nonIdentifyingIdClassParent1Repo.save(parent1);
}

我正在使用 IdClass 研究有关复合键的 JPA。

当复合键具有空值时,我测试了保存方法。

在使用@Transactional 的compositeKeyTest1 中,compositeKeyTest1 将通过@Id 字段具有空值。

显然,parent1 实体没有保存在数据库中。

正如我所料,compositeKeyTest2 不会通过错误日志“列'parent_id2'不能为空”。

听起来它与持久性上下文有关,但我无法理解,因为在 nonIdentifyingIdClassParent1Repo.save(parent1); 之后什么都没有。

标签: jpa

解决方案


推荐阅读