我有一個Parent-Child重新分配,當我嘗試通過Parent上的更新添加新的Child時,我的問題就開始了。Java Hibernate + spring-data:父級持久化時Cascading Childs不工作
當我的父是短暫的,一切正常
CreditCard cc = new CreditCard("1234");
//User
User u1 = new User("KILLER");
u1.addCreditCard(cc); // bi-directional happens here inside.
// An autowired Spring Data repository that implements CrudRepository
userRepository.save(u1);
Assert.assertEquals(1, u1.getCreditCardCollection().size());
Assert.assertNotNull
(
u1.getCreditCardCollection()
.stream()
.findFirst()
.get()
.getIdCreditCard()
);
測試以上成功地執行,並且用於CC對象產生的ID。
但是當我做:
User u2 = new User("Foo Bar McLoud"); // u2 is transient
userRepository.save(u2); // Now u2 is persistent
u2 = userRepository.findOne(u2.getIdLogin());// just to be sure I´m working with a persistent object ;)
CreditCard ccNew = new CreditCard("77777");
u2.addCreditCard(ccNew);// bidirectional happens here inside
userRepository.save(u2); // should insert a new credit card right???
Assert.assertEquals("User should have 1 credit card.",
1, u2.getCreditCardCollection().size()); // PASS
Set<CreditCard> ccs = u2.getCreditCardCollection();
for (CreditCard cc : ccs) {
Assert.assertNotNull("CreditCard ID is null", cc.getIdCreditCard()); // FAIL: id is not generated. The database entry was not set. Added credit card is still transient...
}
所以,在我的第二個測試,我ccNew仍然是其母公司更新後短暫的。
爲什麼它仍然是瞬態的?
子配置:
@JoinColumn(name = "id_user")
@ManyToOne(optional = false)
private User user;
父配置:
@OneToMany(mappedBy = "user",cascade=javax.persistence.CascadeType.ALL)
private Set<CreditCard> creditCardCollection = new HashSet<>();
?你使用'getEntityManager()。merge(value)'或'getEntityManager()。persist(value)'? –
無..只是使用spring-jpa ...只需將註釋接口UserRepository進行轉換並將其自動裝配到類屬性中。 – user3810036