ユーザーと国という 2 つのエンティティ タイプがあるとします。
国エンティティは作成されず、変更できません。ISO alpha3 国コード (例: "USA") がキーになっています。それらは、PK 列 ID を持つテーブル COUNTRY に存在します。
ユーザーには、国への多対 1 のマッピング (カスケード = なし) があります。ユーザーは、COUNTRY(ID) を参照する FK 列 COUNTRY_ID を持つ USER テーブルに存在します。
新しいユーザーを作成するとき、私は次のようなことをするかもしれません:
User user = new User();
user.setCountry(em.find(Country.class, "USA"));
em.persist(user);
ただし、最初にCOUNTRYに対するクエリが必要なため、これは無駄だと思います。だから私はこれもできることに気づきました:
Country usa = new Country();
usa.setId("USA");
User user = new User();
user.setCountry(usa);
em.persist(user);
cascade = "none" であるため、COUNTRY テーブルをクエリする必要はありません。「USA」を COUNTRY_ID として USER に直接挿入するだけです。あれは正しいですか?
ここで、COUNTRY_ID = "USA" のユーザーのみを作成するコードがあるとします。その場合、Country の静的インスタンスを ID = "USA" で保存し、それを新しいユーザーごとに使用することにしましたか? 例えば:
public class UsaUserFactory implements Factory<User> {
private static final Country USA = new Country();
static { USA.setId("USA"); }
public User newInstance() {
User user = new User();
user.setCountry(USA);
return user;
}
}
public SomeOtherClass {
public void persistUser(EntityManager em, Factory<User> uf, ...) {
User user = uf.newInstance();
// set some other properties
em.persist(user);
}
}
persistUser() が複数のスレッドから、また複数の永続化コンテキスト内から同時に呼び出されると仮定します。
私の質問:
永続的な User エンティティは、シングルトンの "USA" Country インスタンスを何らかの方法で変更しますか?
これは、他のいくつかの理由でまったくお勧めできませんか?
上記の 2 つのクラスは、問題を説明するためのものです。私は実際にはそれほど愚かなことはしていません。