0

と の 2 つの JPA エンティティがPersonありAddressます。

Addressクラスは、異なるクラスで使用される共通のクラスです。

Personクラスでは、次のような関係@OneToOneがあります。

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

RESOURCE_LOCALスタンドアロン アプリケーションでオプション付きのJPA を使用しています。

Persona 、 anをインスタンス化し、Addressすべての属性を入力して、JPA にすべてを保存するように依頼しますem.merge(person)

レコードはデータベースに既に存在するため、JPA がすべての情報を更新することを期待しています。ただし、個人インスタンスでも何かを変更した場合にのみ、住所情報が更新されます。アドレス インスタンスの一部の情報を変更し、JPA に を保存するように依頼してもPerson、何も更新されません。Hibernate によって生成された SQL を確認したところ、merge()操作の直後に、テーブルでのみ実行SELECTされましたperson(テーブルに参加しましたaddress)。

私が持っているクラスとクラスのPerson両方で、Eclipseのデフォルトの実装を使用しています。Addressequals()hashCode()

に更新をカスケードする方法についてのアイデアはありAddressますか?

4

1 に答える 1

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();

ここで、 または のいずれPersonかを更新しようとしてもAddress、オブジェクトが切り離されているため更新されません。

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");
于 2012-11-10T20:07:38.007 に答える