如何防止Hibernate在解析unsaved-value时调用默认构造函数

时间:2016-01-26 13:26:36

标签: java hibernate jpa orm hibernate-mapping

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

实施例: 一个简单的类,用作使用hibernate保存的实体。

@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();

已经生成控制台输出:    叫做构造函数

1 个答案:

答案 0 :(得分:1)

没有理由担心在启动时创建的对象。创建一个对象需要大约100 ns,所以如果你有100个实体(合理的中型企业应用程序),这个过程仍然需要大约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>