Это недостающая реализация в JPA-реализации hibernate? - PullRequest
2 голосов
/ 19 января 2010

На пути к пониманию transaction-type атрибута persistence.xml я столкнулся с проблемой / несоответствием между hibernate-core и JPA-hibernate, что выглядит странно.

Я не совсем уверен, является ли это отсутствующей реализацией с JPA hibernate.

Позвольте мне опубликовать сравнение между результатами реализации JPA и гибернационной реализацией той же концепции.

Окружающая среда

  1. Затмение 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;</p> <pre><code>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 реализация Hibernate

package com.expt.hibernate.jpa;</p> <pre><code>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)].

создать драйвер и выполнить

  1. добавить студента и

  2. запросить список студентов и распечатать их данные.

Тогда проблема возникает при запуске программы драйвера.

Hibernate ядро ​​- вывод

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) ....</p> <p>....

Это исключение высвечивается при первом запуске драйвера.

JPA Hibernate - вывод

Первое выполнение драйвера на новой БД обеспечивало следующий вывод.

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_</p> <p>student list size ==> 1</p> <p>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_</p> <p>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 ....</p> <p>....

Может ли кто-нибудь сообщить мне, если вы столкнулись с таким несоответствием?

Кроме того, кто-нибудь может сообщить мне, если проблема заключается в отсутствующей реализации в JPA-Hibernate?

~ Jegan

Ответы [ 3 ]

5 голосов
/ 19 января 2010

Ну, у вас есть "последовательное" исключение:

org.hibernate.InstantiationException: No default constructor for entity: com.expt.hibernate.core.Student

Просто добавьте конструктор по умолчанию в объекте Student (спецификация JPA фактически обязывает конструктор по умолчанию для сопоставленных классов, чтобы поставщик JPA мог динамически создавать экземпляр класса).

Обновление: (отвечая на комментарий от ОП)

да. я могу добавить конструктор по умолчанию и заставить его работать, но я просто хотел, чтобы JPA-Hibernate сообщал мне в самом начале, а не во втором запуске. Кроме того, мне не очень важна тема, которая дает исключение во время второго запуска, а не в первом запуске

Честно говоря, я не могу сказать, почему он работает в первый раз с JPA / Hibernate и не работает напрямую с ядром Hibernate (ну, очевидно, JPA / Hibernate не использовал динамическое создание экземпляров при первом запуске, но я не знаю почему и, на самом деле, вы пропустили интересные части трассировки стека :) В любом случае, Hibernate и спецификация JPA не требуют, чтобы исключения создавались одновременно, они предписывают вам предоставить конструктор по умолчанию для ваших сущностей, и вы не ' т. Так что я бы не стал тратить слишком много времени на эту небольшую поведенческую разницу, так как это деталь реализации. Просто построить в спецификации и вуаля! И если вы действительно хотите знать, у вас есть исходный код, у вас есть отладчик. Просто используйте их:)

0 голосов
/ 12 марта 2018

Классу нужен конструктор по умолчанию:

public final class Student implements Serializable {
    // ...
    public Student() {
        super();
    }
    // ...
}
0 голосов
/ 20 января 2010

В обоих случаях вы получили ошибку, которая помешала операции, которая требует конструктора по умолчанию, и мы оба знаем, что это была проблема и каково ее решение.

о различном поведении, на которое я не могу вам ответить, вы должны предоставить больше информации о том, как вы сохраняете объекты в обоих случаях, может быть, сбрасывание сеанса или невыполнение транзакции может привести к позднему появлению ошибки с помощью JPA !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...