是否缺少JPA实现hibernate的实现?

Jeg*_*iya 2 java orm hibernate jpa

在我理解transaction-type属性的过程中persistence.xml,我遇到了hibernate-core和JPA-hibernate之间的问题/差异,这看起来很奇怪.

我不确定它是否是一个缺少JPA的hibernate实现.

让我发布JPA实现的结果与同一概念的hibernate实现之间的比较.

环境

  1. Eclipse 3.5.1
  2. JSE v1.6.0_05
  3. Hibernate v3.2.3 [用于hibernate核心]
  4. Hibernate-EntityManger v3.4.0 [适用于JPA]
  5. MySQL DB v5.0

问题

1.Hibernate核心

package com.expt.hibernate.core;

import java.io.Serializable;

public final class Student implements Serializable {

    private int studId;

    private String studName;

    private String studEmailId;

    public Student(final String studName, final String studEmailId) {
       this.studName = studName;
       this.studEmailId = studEmailId;
    }

    public int getStudId() {
       return this.studId;
    }

    public String getStudName() {
       return this.studName;
    }

    public String getStudEmailId() {
        return this.studEmailId;
    }

    private void setStudId(int studId) {
        this.studId = studId;
    }

    private void setStudName(String studName) {
        this.studName = stuName;
    }

    private void setStudEmailId(int studEmailId) {
        this.studEmailId = studEmailId;
    }
Run Code Online (Sandbox Code Playgroud)

}

package com.expt.hibernate.jpa;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Student_Info")
public final class Student implements Serializable {

  @Id
  @GeneratedValue
  @Column(name = "STUD_ID", length = 5)
  private int studId;

  @Column(name = "STUD_NAME", nullable = false, length = 25)
  private String studName;

  @Column(name = "STUD_EMAIL", nullable = true, length = 30)
  private String studEmailId;

  public Student(final String studName, final String studEmailId) {
     this.studName = studName;
     this.studEmailId = studEmailId;
  }

  public int getStudId() {
     return this.studId;
  }

  public String getStudName() {
     return this.studName;
  }

  public String getStudEmailId() {
     return this.studEmailId;
  }
Run Code Online (Sandbox Code Playgroud)

}

hibernate-cfg.xml [in case of hibernate core]

2. JPA实现Hibernate

persistence.xml [in case of JPA (hibernate entity manager)]

Exception in thread "main" org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.core.Student at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:84) at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:100) at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:351) at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:3604) ....

....

DEBUG SQL:111 - insert into student.Student_Info (STUD_EMAIL, STUD_NAME) values (?, ?) 17:38:24,229 DEBUG SQL:111 - select student0_.STUD_ID as STUD1_0_, student0_.STUD_EMAIL as STUD2_0_, student0_.STUD_NAME as STUD3_0_ from student.Student_Info student0_

student list size ==> 1

1 || Jegan || jegan.k@opensource.com 和中提供了数据库配置属性 DEBUG SQL:111 - insert into student.Student_Info (STUD_EMAIL, STUD_NAME) values (?, ?) 17:40:25,254 DEBUG SQL:111 - select student0_.STUD_ID as STUD1_0_, student0_.STUD_EMAIL as STUD2_0_, student0_.STUD_NAME as STUD3_0_ from student.Student_Info student0_

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.jpa.Student at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:76) at driver.StudentDriver.main(StudentDriver.java:43) Caused by: org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.jpa.Student ....

.... .

创建一个驱动程序并执行

  1. 添加学生和

  2. 查询学生列表并打印他们的详细信息.

然后在运行驱动程序时出现问题.

Hibernate核心 - 输出

transaction-type

persistence.xml

package com.expt.hibernate.core;

import java.io.Serializable;

public final class Student implements Serializable {

    private int studId;

    private String studName;

    private String studEmailId;

    public Student(final String studName, final String studEmailId) {
       this.studName = studName;
       this.studEmailId = studEmailId;
    }

    public int getStudId() {
       return this.studId;
    }

    public String getStudName() {
       return this.studName;
    }

    public String getStudEmailId() {
        return this.studEmailId;
    }

    private void setStudId(int studId) {
        this.studId = studId;
    }

    private void setStudName(String studName) {
        this.studName = stuName;
    }

    private void setStudEmailId(int studEmailId) {
        this.studEmailId = studEmailId;
    }
Run Code Online (Sandbox Code Playgroud)

}

第一次执行驱动程序时会闪烁此异常.

JPA Hibernate - 输出

首先在新数据库上执行驱动程序提供了以下输出.

package com.expt.hibernate.jpa;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Student_Info")
public final class Student implements Serializable {

  @Id
  @GeneratedValue
  @Column(name = "STUD_ID", length = 5)
  private int studId;

  @Column(name = "STUD_NAME", nullable = false, length = 25)
  private String studName;

  @Column(name = "STUD_EMAIL", nullable = true, length = 30)
  private String studEmailId;

  public Student(final String studName, final String studEmailId) {
     this.studName = studName;
     this.studEmailId = studEmailId;
  }

  public int getStudId() {
     return this.studId;
  }

  public String getStudName() {
     return this.studName;
  }

  public String getStudEmailId() {
     return this.studEmailId;
  }
Run Code Online (Sandbox Code Playgroud)

}

hibernate-cfg.xml [in case of hibernate core]

persistence.xml [in case of JPA (hibernate entity manager)]

第二次执行驱动程序提供了以下输出.

Exception in thread "main" org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.core.Student at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:84) at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:100) at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:351) at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:3604) ....

....

DEBUG SQL:111 - insert into student.Student_Info (STUD_EMAIL, STUD_NAME) values (?, ?) 17:38:24,229 DEBUG SQL:111 - select student0_.STUD_ID as STUD1_0_, student0_.STUD_EMAIL as STUD2_0_, student0_.STUD_NAME as STUD3_0_ from student.Student_Info student0_

student list size ==> 1

1 || Jegan || jegan.k@opensource.com

DEBUG SQL:111 - insert into student.Student_Info (STUD_EMAIL, STUD_NAME) values (?, ?) 17:40:25,254 DEBUG SQL:111 - select student0_.STUD_ID as STUD1_0_, student0_.STUD_EMAIL as STUD2_0_, student0_.STUD_NAME as STUD3_0_ from student.Student_Info student0_

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.jpa.Student at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:76) at driver.StudentDriver.main(StudentDriver.java:43) Caused by: org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.jpa.Student ....

....

如果您遇到这种不一致的情况,有人可以告诉我吗?

此外,如果问题是JPA-Hibernate缺少实现,有谁能告诉我?

~Jegan

Pas*_*ent 5

好吧,你有一个"一致"的例外:

org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.core.Student
Run Code Online (Sandbox Code Playgroud)

只需在Student实体上添加一个默认构造函数(JPA规范实际上要求映射类上的默认构造函数,以便JPA提供程序可以对类进行动态实例化).

更新:(回答OP的评论)

是的.我可以添加一个默认的构造函数并让它工作,但我只是想让JPA-Hibernate在第一次运行时告诉我不要在第二次运行中.此外,我真的不是它背后的主题在第二次运行期间而不是在第一次运行中给出异常

老实说,我不能说为什么它第一次使用JPA/Hibernate并直接使用Hibernate核心(显然,JPA/Hibernate在第一次运行时没有使用动态实例化,但我不知道为什么,实际上,你跳过了栈跟踪的有趣部分:)无论如何,Hibernate和JPA规范并没有要求同时抛出异常,它们要求你在你的实体上提供默认构造函数而你却没有.所以,我不会花太多时间在这个小的行为差异上,因为这是一个实现细节.只是建立规范和vo!如果你真的想知道,你有源代码,你有一个调试器.只是使用它们:)