データベースにデフォルト値が保持されているアプリケーションがあります。たとえば、属性 City を持つクラス Person のデフォルトは ID 0 の "New York" です。
@Entity
public class Person {
@Id
private Integer personId;
private String name;
@ManyToOne
private City city;
}
@Entity
public class City {
@Id
private Integer cityId;
private String cityName;
}
そしてデータベースで:
+--------+------------+
| cityId | cityName |
+--------+------------+
| 0 | 'New York' |
+--------+------------+
そして、私がやりたいことは、新しい Person を保存することです:
Person p = new Person();
p.setName("Smith");
personRepository.save(p);
ID 0 で名前が「New York」の都市インスタンスを作成しようとすると、「TransientObjectException: オブジェクトが保存されていない一時インスタンスを参照しています」というメッセージが表示されます。これは間違いなく適切な解決策ではありません。
テーブル定義にデフォルト値を設定すると、保存後にデータベースからエンティティをリロードする必要があります。
Person を保存する前に都市をロードすることもできますが、データベースにも 2 つのアクセス権があります。
データベースから City インスタンスを明示的にロードする必要があるため、これら 2 つのソリューションは私には適していません。自動的に行う方法はありますか?(たぶんインターセプターかそのようなもの)
NB: hibernate 4 と spring 3.2 を使用しています