Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止Hibernate在解析未保存的值时调用默认构造函数_Java_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

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

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

我使用的是Hibernate 4.1.6.Final,注意到在启动过程中调用了每个实体的构造函数。
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;
    
  • 您使用HBM XML映射(没有
    未保存的值
    注释等价物):

    
    

  • 为什么这很重要?我看不出它会有什么负面影响,除非你在构造器中发生了什么。实体构造器中可能不应该发生的事情。在我的情况下,你的第一个答案是有效的,当然现在需要手动设置
    id
    。问题更多的是关于这个意外行为本身,因为它让我感到惊讶。Hibernate必须知道在决定实体是暂时的还是分离的时要比较什么值。如果没有
    未保存的值
    ,则需要一个SELECT查询来知道内存中托管实体是否有镜像表行。
    <id name="id" type="Long" column="id" unsaved-value="null">
        <generator class="native"/>
    </id>