2016-04-28 9 views
0

Ich bin neu bei Spring Data und möchte wissen, wie die untergeordneten Objekte beim Speichern des übergeordneten Objekts aktualisiert werden.Das Aktualisieren eines untergeordneten Objekts in einer Speicherkaskade führt zu ConstraintViolationException mithilfe des Quelldatenrepositorys.

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; 

} 

Das Repository:

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

Und die Unit-Test:

@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); 
} 

Also hier das Problem ist, dass es versucht, b einzufügen, anstatt sie zu aktualisieren . Ist es möglich, Kaskade zu verwenden, um es zu aktualisieren?

Antwort

0

Zunächst müssen Sie alle angeschlossenen Objekte in einem @Transactional beibehalten. Dann müssen Sie das Kind abholen, und wenn es existiert, weisen Sie das vorhandene Kind A zu, andernfalls erstellen Sie ein neues Kind.

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