Java 如何防止Hibernate在解析未保存的值时调用默认构造函数
我使用的是Hibernate 4.1.6.Final,注意到在启动过程中调用了每个实体的构造函数。Java 如何防止Hibernate在解析未保存的值时调用默认构造函数,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我使用的是Hibernate 4.1.6.Final,注意到在启动过程中调用了每个实体的构造函数。EntityManager实例化每个标有@Entity的类作为测试,以获取未保存的值标识符。我使用的Hibernate没有映射文件,只使用注释。是否可以防止hibernate在注释中使用预定义的标识符实例化每个实体一次 例如: 一个简单的类,用作hibernate保存的实体 @Entity public class SimpleEntity { @Id @GeneratedValu
EntityManager
实例化每个标有@Entity
的类作为测试,以获取未保存的值
标识符。我使用的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();
已生成控制台输出:
调用构造函数没有理由担心在启动时创建这些对象。创建一个对象大约需要100纳秒,因此如果您有100个实体(合理的中型企业应用程序),这个过程仍然需要大约10微秒(0.01毫秒)。 与运行简单的数据库查询(例如0.1-10毫秒)或更复杂的查询(例如100-1000毫秒)所需的时间相比,这是微不足道的 唯一的解决办法是:
@Id
private Long id = null;
未保存的值
注释等价物):
为什么这很重要?我看不出它会有什么负面影响,除非你在构造器中发生了什么。实体构造器中可能不应该发生的事情。在我的情况下,你的第一个答案是有效的,当然现在需要手动设置
id
。问题更多的是关于这个意外行为本身,因为它让我感到惊讶。Hibernate必须知道在决定实体是暂时的还是分离的时要比较什么值。如果没有未保存的值
,则需要一个SELECT查询来知道内存中托管实体是否有镜像表行。
<id name="id" type="Long" column="id" unsaved-value="null">
<generator class="native"/>
</id>