![](/img/trans.png)
[英]Spring JPA how to persist parent when the child is persisted in ManyToMany relationship
[英]JPA persists already persisted Objects from a ManyToMany relationship
我在類A和類B之間有一個@ManyToMany關系:類A引用了類B實例的集合,並且此關系配置為CascadeType.ALL。 因此,當A與實體管理器一起保留時,由A引用的B實例也將保留。
A和B都有一個使用GenerationType.IDENTITY策略聲明的ID,以使用MySQL數據庫中的auto_inc。
問題是 :
=> JPA嘗試持久化B對象,盡管它們已經被持久化(它們剛剛已經被加載)。
我不明白為什么它會嘗試再次保留它們,它們已正確加載,並且它們的自動生成的ID也已很好加載。
ManyToMany聲明:
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(name = "ENTRY_ENTITIES", joinColumns =
@JoinColumn(name = "ENTRY", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "ENTITY", referencedColumnName = "ID"))
private List<Entity> entities;
從數據庫加載現有對象的查詢:
T result = (T) entityManager.createQuery("SELECT x FROM " + entityName + " x WHERE x.externalId='" + externalId + "'").getSingleResult();
堅持:
UserTransaction transaction = getTransaction();
try {
transaction.begin();
entityManager.persist(entity);
transaction.commit();
} catch (Throwable t) {
Logger.getLogger(JpaDao.class.getName()).log(Level.SEVERE, null, t);
}
非常感謝你的幫助!
我不太確定這是造成問題的原因,但是您應該將整個事情都包含在交易中。 不只是持久性部分:
start transaction
load B from DB
create new A
add B to A
commit transaction
正如我在評論中所說,您還有其他設計和編碼問題:
SELECT x FROM A x WHERE x.externalId = :externalId
在將這些B實體添加到A時,這些B實體可能是另一個持久性上下文的一部分。您是否在開始事務之后是否嘗試過在B實體上使用合並操作 , 然后再將它們添加到A實體中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.