如何防止 Hibernate 在解析未保存值时调用默认构造函数

How to prevent Hibernate from calling default constructor when resolving the unsaved-value

我正在使用 Hibernate 4.1。6.Final 并注意到,在启动期间,每个实体的构造函数都会被调用。 EntityManager 实例化每个用 @Entity 标记的 class 作为测试,以获得 unsavedValue 标识符。我在没有映射文件的情况下使用 Hibernate,仅使用注释。是否可以防止休眠实例化每个实体一次,可能在注释中使用预定义的标识符?

示例: 一个简单的 class 用作实体以使用休眠保存。

@Entity
public class SimpleEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id = null;

    public SimpleEntity() {
        System.out.println("called constructor");
    }
}

创建EntityManagerFactory的调用,构造对象的地方:

public static EntityManagerFactory getEntityManagerFactory() {
    EntityManagerFactory emf =  Persistence.createEntityManagerFactory("hsqldb-ds");
    return emf;
}

正在通话:

EntityManagerUtil.getEntityManagerFactory().createEntityManager();

已经生成控制台输出: 调用了构造函数

没有理由担心这些对象是在启动时创建的。创建一个对象大约需要 100 纳秒,所以如果您有 100 个实体(合理的 medium-size 企业应用程序),这个过程仍然需要大约 10 微秒(0.01 毫秒)。 与 运行 一个简单的数据库查询(例如 0.1-10 毫秒)或更复杂的查询(例如 100-1000 毫秒)所花费的时间相比,这是微不足道的。

唯一的解决方法是:

  1. 您切换到分配的标识符:

    @Id
    private Long id = null;
    
  2. 您使用 HBM XML 映射(没有 unsaved-value 等效注释):

    <id name="id" type="Long" column="id" unsaved-value="null">
        <generator class="native"/>
    </id>