在创建实体时添加静态属性数据

时间:2010-11-15 23:50:59

标签: java hibernate jpa persistence hibernate-mapping

假设我有两种实体类型:用户和国家。

国家/地区实体永远不会创建且不可变。它们受ISO alpha3国家/地区代码的约束,例如: “美国”。它们位于具有PK列ID的表COUNTRY中。

用户与Country * / cascade = none的多对一​​映射。用户驻留在USER表中,其中包含引用COUNTRY(ID)的FK列COUNTRY_ID。

创建新用户时,我可能会执行以下操作:

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”的用户。在这种情况下,我想到存储ID为“USA”的Country的静态实例并将其用于每个新用户?例如:

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. 持久用户实体是否会以任何方式改变我的单身“USA”国家/地区实例?

  2. 这完全是出于其他原因而不可取的吗?

  3. 以上两个类只是为了说明这个问题;我实际上并没有做任何愚蠢的事情。

1 个答案:

答案 0 :(得分:1)

我更倾向于尝试使用缓存来获取只读数据以减少实际的数据库调用。有关设置可能有用的缓存的帮助,请参阅here