在我理解transaction-type
的{{1}}属性的过程中,我遇到了hibernate-core和JPA-hibernate之间的问题/差异,这看起来很奇怪。
我不确定它是否缺少JPA的hibernate实现。
让我发布JPA实现的结果与同一概念的hibernate实现之间的比较。
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;
}
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;
}
}
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;
}
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;
}
中提供了数据库配置属性。
创建驱动程序并执行
添加学生
查询学生名单并打印他们的详细信息。
然后在运行驱动程序时出现问题。
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
如果您遇到这种不一致的情况,有人可以告诉我吗?
另外,如果问题是JPA-Hibernate缺少实现,请问有谁可以告诉我吗?
~Jegan
答案 0 :(得分:5)
嗯,你有一个“一致”的例外:
org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.core.Student
只需在Student实体上添加一个默认构造函数(JPA规范实际上要求映射类上的默认构造函数,以便JPA提供程序可以对类进行动态实例化)。
更新:(回复OP的评论)
耶。我可以添加一个默认的构造函数并让它工作但我只是想让JPA-Hibernate在第一次运行时告诉我不要在第二次运行中。另外,我真的不是它背后的主题在第二次运行期间而不是在第一次运行中给出异常
老实说,我不能说为什么它第一次使用JPA / Hibernate并直接使用Hibernate核心(显然,JPA / Hibernate在第一次运行时没有使用动态实例化但我不知道为什么,实际上,你跳过堆栈跟踪的有趣部分:)无论如何,Hibernate和JPA规范不要求同时抛出异常,它们要求你在你的实体上提供一个默认的构造函数而你没有'吨。所以,我不会花太多时间在这个小的行为差异上,因为这是一个实现细节。只是建立规范和vo!如果你真的想知道,你有源代码,你有一个调试器。只需使用它们:)
答案 1 :(得分:0)
在这两种情况下,你都会遇到一个阻止操作的错误,这需要默认的构造函数,我们都知道这就是问题,解决方案是什么。
关于我无法回答您的不同行为,您应该提供有关如何在两种情况下保存对象的更多信息,可能是会话刷新,或者未执行的事务可能导致使用错误的后期出现JPA !!
答案 2 :(得分:0)
该类需要一个默认构造函数:
public final class Student implements Serializable {
// ...
public Student() {
super();
}
// ...
}