1

DDL スクリプトを実行して、データベースに完全な国テーブルをセットアップしました。国テーブルの主キー列には、すべての国に対応する ISO コードが含まれています。

私の JPA プロジェクトには、埋め込まれた Address エンティティを持つ User エンティティがあり、この Address エンティティには Country への参照があります。User と Address の関係は問題ないように思えますが、Address と Country の関係が問題です。多くのアドレスが国を共有できるため、これを ManyToOne 関係としてマッピングしようとしました。

問題: Country クラスの iso メンバー変数に Id で注釈を付けました -> JPA/Hibernate は、国の ID を手動で設定していないと文句を言います。ただし、この場合、データを一度インポートし、ISO コードが一意であり、db スキーマによって主キーとして宣言されているため、ID は既に指定および設定されています。この特殊なケースでは、国テーブルに更新や挿入を行う必要はありません。情報は読み取り専用にする必要があります。

何をすべきか、変更せずに国テーブルを使用できるようにするにはどうすればよいですか?

4

1 に答える 1

0

あなたの質問にはいくつかの詳細が欠けているため、以下には多くの推測が含まれます:-)

クラスCountryは次のようになります。

@Entity
@Immutable
@Table(name="countries")
public class Country {
  @Id
  private String isoCode;
  // all other attributes, getters / setters, etc...
}

@ImmutableJPA 標準のHibernate 拡張です。エンティティに配置する必要はありませんが、配置するとパフォーマンスがわずかに向上します。これにより、実際にはCountry不変になることに注意してください。アプリケーションから国を作成/更新/削除することはできません。十分に頻繁に使用される場合は、エンティティのキ​​ャッシュも構成することができます。Country

Address国への次のマッピングがあります。

@ManyToOne
@JoinColumn(name="country_iso_code")
private Country country;

「カスケード」属性がないことに注意してください。必要ありません。ここでの最後の重要なポイントは、実際にCountryインスタンスを取得またはロードして、アドレスに設定する必要があるということです。

Country country = (Country) session.load(Country.class, isoCode);
// OR
Country country = (Country) session.get(Country.class, isoCode);

address.setCountry(country);
...
session.saveOrUpdate(address);

上記の最初の行はデータベースにヒットしません。そのような ISO コードを持つ国が存在することがわかっている場合に使用します。2 番目のフォームデータベース (または構成されている場合はキャッシュ) にアクセスし、そのコードを持つ国が存在しない場合は NULL を返します。

于 2009-11-17T20:19:36.747 に答える