【问题标题】:adding static property data when creating entities创建实体时添加静态属性数据
【发布时间】:2011-05-10 13:16:27
【问题描述】:

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

国家实体永远不会被创建并且不可变。它们由 ISO alpha3 国家代码键入,例如“美国”。它们位于具有 PK 列 ID 的表 COUNTRY 中。

用户有一个多对一的映射到 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。所以我注意到我也可以这样做:

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. 持久的用户实体会以任何方式改变我的单例“美国”国家实例吗?

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

上面的两个类只是为了说明问题;我实际上并没有做那么愚蠢的事情。

【问题讨论】:

    标签: java hibernate jpa persistence hibernate-mapping


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多