JPA级联不起作用

时间:2012-11-10 02:20:18

标签: java hibernate jpa cascade

我有两个JPA实体:PersonAddress

Address类是不同类使用的常见classe。

Person课程中,我有一个@OneToOne关系:

@OneToOne(cascade = CascadeType.ALL)
private Address address;

我在独立应用程序中使用带RESOURCE_LOCAL选项的JPA。

我实例化PersonAddress,填写所有属性,并要求JPA按em.merge(person)保存全部。

由于数据库中已经存在记录,我希望JPA能够更新所有信息。但是,如果我也在人物实例上也改变了某些内容,它只会更新地址信息。如果我只是更改地址实例的一些信息并要求JPA保存Person,则不会更新任何内容。我通过Hibernate检查生成的SQL,并且在merge()操作中,它只在SELECT表执行person(加入address表)。

PersonAddress类中,我使用Eclipse的默认实现equals()hashCode()

有关如何将更新级联到Address

的任何想法

1 个答案:

答案 0 :(得分:0)

Person课程中:

@OneToOne(cascade = CascadeType.ALL)
private Address address;

保存时,您可以执行以下操作:

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();

session.beginTransaction();
session.saveOrUpdate(person);

// Hibernate will automatically update because the object is in persistence context
address.setStreetName(" Updated Street Name"); 

// Hibernate will automatically update because the object is in persistence context
person.setPersonName("Updated Name"); 

session.getTransaction().commit();

// person object is now detached
session.close();

现在,如果您尝试更新PersonAddress,则不会更新它们,因为该对象现已分离:

user.setUserName("If you try to update, it will not since session is closed");
address.setStreetName("If you try to update, it will not since session is closed");