2010-11-15 46 views
0

假設我有兩種實體類型:用戶和國家。創建實體時添加靜態屬性數據

國家實體從未被創建並且不可變。它們由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()從多個線程並從多個持久化上下文中併發調用。

我的問題:

  1. 將堅持用戶實體變異我單身「美國」國家例如以任何方式?

  2. 由於其他原因,這完全不合適嗎?

以上兩類只是爲了說明問題;我實際上並沒有做任何非常愚蠢的事情。

回答

1

我會更傾向於嘗試使用只讀數據緩存來減少實際的數據庫調用。請參閱here以獲取幫助,以設置可能有所幫助的緩存。

相關問題