假設我有兩種實體類型:用戶和國家。創建實體時添加靜態屬性數據
國家實體從未被創建並且不可變。它們由ISO alpha3國家代碼(例如, 「美國」。它們駐留在具有PK列ID的COUNTRY表中。
用戶可以通過多對一的映射到國家w/cascade = none。用戶使用引用COUNTRY(ID)的FK列COUNTRY_ID駐留在USER表中。
當創建一個新的用戶我可能會做這樣的事情:
User user = new User();
user.setCountry(em.find(Country.class, "USA"));
em.persist(user);
我推測這是浪費,雖然,因爲它需要對國家查詢第一。所以我注意到我也可以這樣做:
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」的用戶。在那種情況下,我想到了將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()從多個線程並從多個持久化上下文中併發調用。
我的問題:
將堅持用戶實體變異我單身「美國」國家例如以任何方式?
由於其他原因,這完全不合適嗎?
以上兩類只是爲了說明問題;我實際上並沒有做任何非常愚蠢的事情。