Hi all,
On my way in understanding the transaction-type attribute of persistence.xml, i came across an issue / discrepency between hibernate-core and JPA-hibernate which looks weird.
I am not pretty sure whether it is a missing implementation with JPA of hibernate.
Let me post the comparison between the outcome of JPA implementation and the hibernate implementation of the same concept.
Environment
Eclipse 3.5.1
JSE v1.6.0_05
Hibernate v3.2.3 [for hibernate core]
Hibernate-EntityManger v3.4.0 [for JPA]
MySQL DB v5.0
Issue
1.Hibernate
core
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;
}
}
2. JPA implementaion of 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;
}
}
Also, I have provided the DB configuration properties in the associated hibernate-cfg.xml [in case of hibernate core] and persistence.xml [in case of JPA (hibernate entity manager)].
create a driver and perform
add a student and
query for the list of students and print their details.
Then the issue comes when you run the driver program.
Hibernate
core - output
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)
....
....
This exception is flashed when the driver is executed for the first time itself.
JPA Hibernate - output
First execution of the driver on a fresh DB provided the following output.
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 ||
[email protected]
second execution of the driver provided the following output.
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
....
....
Could anyone please let me know if you have encountered this sort of inconsistency?
Also, could anyone please let me know if the issue is a missing implementation with JPA-Hibernate?
~ Jegan