我正在使用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();
已经生成控制台输出: 叫做构造函数
答案 0 :(得分:1)
没有理由担心在启动时创建的对象。创建一个对象需要大约100 ns,所以如果你有100个实体(合理的中型企业应用程序),这个过程仍然需要大约10微秒(0.01毫秒)。 与运行简单数据库查询(例如0.1-10毫秒)或更复杂查询(例如100-1000毫秒)所需的量相比,这是微不足道的。
唯一的解决方法是:
您切换到指定的标识符:
@Id
private Long id = null;
您使用HBM XML映射(没有等效的unsaved-value
注释):
<id name="id" type="Long" column="id" unsaved-value="null">
<generator class="native"/>
</id>