【发布时间】:2011-11-28 22:21:36
【问题描述】:
我在 A 类和 B 类之间有一个 @ManyToMany 关系:A 类引用 B 类实例的集合,并且这种关系被配置为 CascadeType.ALL。所以当 A 被实体管理器持久化时,A 引用的 B 实例也被持久化。
A 和 B 都有一个使用 GenerationType.IDENTITY 策略声明的 ID,以使用 MySQL 数据库中的 auto_inc。
问题是:
- 我新建了一个A
- 我使用 JPQL 从 entityManager 加载了一些现有的 B 对象
- 我将 B 对象添加到 A 的 B 集合中
=> 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);
}
非常感谢您的帮助!
【问题讨论】:
-
向我们展示实体的代码、它们的映射以及执行持久化的代码。告诉我们您正在使用哪个 JPA 引擎。请注意,在 ManyToMany 上级联 ALL 是错误的:您不希望在删除 A 时删除 A 的所有 B,因为 B 被其他 As 引用。
-
好的,感谢您的帮助。我添加了代码。