使用spring数据存储库更新保存级联中的子对象会导致ConstraintViolationException

时间:2016-04-28 14:55:30

标签: java spring hibernate spring-data-jpa cascade

我是Spring Data的新手,我想知道在保存父对象时如何更新子对象。

POJO的:

@Entity
@Table(name = "A")
public final class A {
    @Id
    @Column(name = "A_ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "B_ID")
    private B b;        
}

@Entity
@Table(name = "B")
public final class B {

    @Id
    @Column(name = "B_ID")
    private Long id;

    @Column(name = "B_NAME")
    private String bName;  

}

存储库:

public interface ARepository extends JpaRepository<A, Long> {
}    

单元测试:

@Test
public void testSaveA() {
    B b = new B();
    b.setId(1L);
    b.setName("b");
    A a = new A();
    a.setB(b);

    //If b already exists in database then ConstraintViolationException
    ARepository.save(b);
}

所以这里的问题是它试图插入b而不是更新它。 是否可以使用级联来更新它?

1 个答案:

答案 0 :(得分:0)

首先,您必须使用@Transactional来保留任何附加对象。然后你必须获取孩子,如果它存在,则将现有孩子分配给A,否则创建一个新孩子。

@Transactional()
public void update() {
    B b = ARepository.find(1L);
    if (b == null) b = new B();
    //update etc
}