我有一个多对多关系 Person - Preferences(这原则上是一个权限列表)。
映射表是 person_has_preferences。 我的目标是在 Person 表中添加一个新对象,而不在 Preferences 中添加该对象。在当前配置下,所有 3 个表都已更新。这是我的对象配置:
人:@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "person_has_preference", joinColumns = { @JoinColumn(name = "person_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "preference_id", nullable = false) })
private List<Preference> preferences = new ArrayList<Preference>();
偏爱:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "person_has_preference", joinColumns = { @JoinColumn(name = "preference_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "person_id", nullable = false) })
private List<Person> persons;
持久性在这里完成:
EntityManager em = EMF.get().createEntityManager();
em.getTransaction().begin();
if (em.find(Person.class, c.getId()) == null)
em.persist(c);// new contact
else
em.merge(c);// update existing contact
em.getTransaction().commit();
我还注意到,即使对象 Preference 存在(有一个 ID),JPA 总是会创建一个新的 ID。日志:
[EL Fine]: sql: 2013-08-01 10:22:58.244--ClientSession(2012226930)--Connection(583259044)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--插入首选项(名称,父级,类型)值(?,?,?)绑定=> [每周更新,null,1] [EL Finest]:查询:2013-08-01 10:22:58.248--ClientSession( 2012226930)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--执行查询ValueReadQuery(name="SEQ_GEN_IDENTITY" sql="SELECT LAST_INSERT_ID()") [EL Fine]: sql: 2013- 08-01 10:22:58.25--ClientSession(2012226930)--Connection(583259044)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--SELECT LAST_INSERT_ID() [EL Finest]:排序:2013-08-01 10:22:58.253--UnitOfWork(925539554)--Thread(Thread[615154846@qtp-1915686435-7,5,main])--将序列分配给对象 (126 -> org. icg.contacts.manager.shared.jpa.Preference@19eed47)