カスケード経由でデータベースに永続化されているエンティティの自動生成された 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 になります。