0

データベースにデフォルト値が保持されているアプリケーションがあります。たとえば、属性 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 を使用しています

4

1 に答える 1

1

ID 0 で名前が「New York」の都市インスタンスを作成しようとすると、「TransientObjectException: オブジェクトが保存されていない一時インスタンスを参照しています」というメッセージが表示されます。

そうであってはなりません。idおそらく、デフォルトの都市が であることが原因です01代わりに使用してみてください。

Session.load()または、 /を使用して、データベースに触れずに遅延プロキシを取得できますEntityManager.getReference()

于 2013-09-05T08:57:53.837 に答える