JPA就多对多和权威列表而言

时间:2013-08-01 10:27:53

标签: java jpa many-to-many

我有很多关系人物 - 偏好(这原则上是权威列表)。

映射表是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) - 连接(583259044) - 线程(线程[615154846 @ qtp-1915686435-7,5,main] ) - INSERT INTO首选项(NAME,父级,类型)VALUES(?,?,?)     bind =&gt; [每周更新,null,1] [EL Finest]:查询:2013-08-01 10:22:58.248 - ClientSession(2012226930) - 线程(Thread [615154846 @ qtp-1915686435-7,5,main]) - 执行查询ValueReadQuery(name = “SEQ_GEN_IDENTITY”sql =“SELECT LAST_INSERT_ID()”) [EL精细]:sql:2013-08-01 10:22:58.25 - ClientSession(2012226930) - 连接(583259044) - 线程(线程[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 - &gt; org.icg.contacts.manager.shared.jpa.Preference@19eed47)

1 个答案:

答案 0 :(得分:1)

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

每个级联选项的简单说明:http://www.objectdb.com/api/java/jpa/CascadeType