如何防止 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 毫秒)所花费的时间相比,这是微不足道的。
唯一的解决方法是:
您切换到分配的标识符:
@Id
private Long id = null;
您使用 HBM XML 映射(没有 unsaved-value
等效注释):
<id name="id" type="Long" column="id" unsaved-value="null">
<generator class="native"/>
</id>
我正在使用 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 毫秒)所花费的时间相比,这是微不足道的。
唯一的解决方法是:
您切换到分配的标识符:
@Id private Long id = null;
您使用 HBM XML 映射(没有
unsaved-value
等效注释):<id name="id" type="Long" column="id" unsaved-value="null"> <generator class="native"/> </id>