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

标签 java hibernate jpa persistence hibernate-mapping

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

国家/地区实体永远不会被创建,也不可变。它们由 ISO alpha3 国家/地区代码键入,例如“美国”。它们驻留在具有 PK 列 ID 的表 COUNTRY 中。

用户与国家/地区有多对一映射,且级联 = 无。用户驻留在 USER 表中,该表的 FK 列 COUNTRY_ID 引用了 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. 由于其他原因,这完全是不可取的吗?

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

最佳答案

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

关于java - 创建实体时添加静态属性数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189996/

相关文章:

java - Selenium : Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code

java - Spring-Data-Jpa:带子查询的内部连接

java - 如何将 Spring MVC 连接到远程 MongoDB,以使用 MongoOperations 接口(interface)?

java - 如何在不在 java 中运行 curl 命令的情况下从 java 访问 github graphql API

java - 在 Hibernate 中保留 Joda DateTime 而不是 Java Date

java - Hibernate抛出转换数据类型异常

java - JPA 2 - 获取@OneToMany 关系中列表的最后一个元素

java - 通用 JDBC 异常 : could not extract ResultSet

jpa - Kotlin 继承和 JPA

java - CTRL-G 在 Eclipse 中做什么?