1

我有一个多对多关系 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)

4

1 回答 1

1

您正在使用启用插入的 CascadeType.ALL。将 CascadeType 更改为您的需求,例如 CascadeType.REFRESH 或 CascadeType.REMOVE 等。

每个 Cascade 选项的简单说明:http ://www.objectdb.com/api/java/jpa/Cas​​cadeType

于 2013-08-01T10:29:38.347 回答