0

カスケード経由でデータベースに永続化されているエンティティの自動生成された ID を取得する方法を見つけようとしています。Hibernate 4.1.9、Spring データ 1.2、および Spring フレームワーク 3.2.1 を使用しています。問題のエンティティは次のとおりです。場所、家、部屋。

場所の親クラス

@Entity
@Table(name = "location")
@Inheritance(strategy = InheritanceType.JOINED)
public class Location implements Serializable
{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "location_id", unique = true)
private long uuid;

// other attributes and methods not relevant
}

部屋のセットを参照して、場所を拡張するホーム クラス

@Entity
@Table(name = "home")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "home_id")
public class Home extends Location implements Serializable
{

@OneToMany(mappedBy = "containingHome", cascade = {CascadeType.ALL}, orphanRemoval = true)
private Set<Room> rooms;
// other attributes and methods not relevant
}

最後に、Home オブジェクトを参照する Room クラス

@Entity
@Table(name = "room")
@PrimaryKeyJoinColumn(name = "room_id")
public class Room extends Location implements Serializable
{

@ManyToOne()
@JoinColumn(name = "home_id")
protected Home containingHome;
// other attributes and methods not relevant
}

Spring データを使用して、エンティティのリポジトリを作成しています。

場所リポジトリ

public interface LocationRepository extends JpaRepository<Location, Long>
{ }

私が抱えている問題は、データベースからさまざまなオブジェクトを取得できるようにするために id が必要であり、それが自動的に生成されることです。要素を介して ID にアクセスできる唯一の方法は、管理対象オブジェクトをデータベースに保存するときに取得することです。しかし、次のように各場所を順番に保存しようとすると:

Home home = new Home();
home = locationService.save(home) // service that just calls locationRepository.save method
Room bedroom = new Room(home);
bedroom = locationService.save(bedroom);

Hibernate の問題https://hibernate.onjira.com/browse/HHH-7404に関連していると思われる、データベース内の部屋のエントリが重複しています。電話するだけなら

Home home = new Home();
Room bedroom = new Room(home);
locationService.save(home) 

double はありませんが、カスケードに永続化され、id が 0 であるため、部屋オブジェクトを取得する方法がありません。自分で生成する必要がある一意の名前のような場所に他のフィールドを導入せずにこれを解決する方法はありますか? ? どんな助けでも大歓迎です。

編集

最後のケースでhome = locationService.save(home)呼び出した場合home.getUuid()、適切な値を取得できますが、これは通常、管理対象オブジェクトを取得するためだと思います。しかしbedroom.getUuid()、ベッドルームが管理されていないため、データベースの値で id フィールドが更新されていないため、0 になります。

4

1 に答える 1

0

永続呼び出しの後に (そのフィールドのゲッターがあると仮定して)呼び出してみhome.getUuid();ましたか?

驚かれるかもしれませんが、Hibernate (および JPA) はメモリ内のコピーを ID で更新します。

于 2013-03-13T15:35:13.753 に答える