我有很多关系人物 - 偏好(这原则上是权威列表)。
映射表是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)
答案 0 :(得分:1)
您正在使用CascadeType.ALL来启用插入功能。将CascadeType更改为您的需求,如CascadeType.REFRESH或CascadeType.REMOVE等。
每个级联选项的简单说明:http://www.objectdb.com/api/java/jpa/CascadeType