org.hibernate.ObjectNotFoundException: ни одна строка с данным идентификатором не существует, но она ДЕЛАЕТ - PullRequest
25 голосов
/ 24 января 2012

У меня проблема гибернации, которую я не могу исправить.

Настройка: Java EE, веб-приложение, Hibernate 3.2, Tomcat 6, Struts 2.

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

Я проверяю базу данных после сохранения объекта и, конечно же, вижу строку со всеми данными.

Но когда я пытаюсь получить его, я получаю это:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [msc.model.Picture#73]

Чтобы сделать ситуацию еще хуже, когда я перезагружаю Tomcat и пытаюсь получить доступ к тому же объекту, я не получаю сообщение об ошибке - Hibernate находит строку просто отлично.

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

Из всего этого я подозреваю ошибку в Hibernate, но я новичок в Hibernate, так что я, вероятно, ошибаюсь. Пожалуйста помоги! Я гуглил и гуглил безрезультатно.

Вот мой конфиг Hibernate:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/msc</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">-------</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">80</property>
        <property name="current_session_context_class">thread</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <mapping resource="msc/model/Picture.hbm.xml"/>
        <mapping resource="msc/model/Comment.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Вот мои два файла сопоставления:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.Picture" table="PICTURE">
    <id column="PICTURE_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="story"/>
    <property name="email"/>
    <property name="category"/>
    <property name="state"/>
    <property name="ratings"/>
    <property name="views"/>
    <property name="timestamp"/>
    <property name="title"/>
    <property lazy="true" name="image" type="blob">
      <column name="IMAGE"/>
    </property>
    <property lazy="true" name="refinedImage" type="blob">
      <column name="REFINEDIMAGE"/>
    </property>
    <property lazy="true" name="thumbnail" type="blob">
      <column name="THUMBNAIL"/>
    </property>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="PICTURE"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

и

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.User" table="USER">
    <id column="USER_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="username"/>
    <property name="email"/>
    <bag cascade="save-update" lazy="true" name="pictures" table="PICTURE">
      <key column="USER"/>
      <one-to-many class="msc.model.Picture"/>
    </bag>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="USER"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, я с радостью вам помогу.

(примечание: это не дубликат этого вопроса, сценарий не тот же самый «Строка с указанным идентификатором не существует», хотя она существует )

РЕДАКТИРОВАТЬ : по запросу, отправив код Java:

Код для сохранения объекта

Session hib_ses = HibernateUtil.getSessionFactory().getCurrentSession();

hib_ses.beginTransaction();

hib_ses.save(user);

hib_ses.getTransaction().commit(); 

Код для отображения данных (в данном случае изображение)

public class ImageAction extends ActionSupport implements ServletResponseAware, SessionAware {

    private HttpServletResponse response;
    Map session;
    private Long id;
    private int thumbnail;
    private InputStream inputStream;

    @Override
    public String execute() throws Exception {
        response.setContentType("image/jpeg");
        Session hib_session = HibernateUtil.getSessionFactory().getCurrentSession();
        hib_session.beginTransaction();

        //what is the ID now?
        Picture pic = (Picture) hib_session.load(Picture.class, getId());

        if (thumbnail == 1) {
            inputStream = (ByteArrayInputStream) pic.getThumbnail().getBinaryStream();
        } else {
            inputStream = (ByteArrayInputStream) pic.getRefinedImage().getBinaryStream();
        }

        hib_session.close();
        return SUCCESS;
    }

Ответы [ 11 ]

0 голосов
/ 24 января 2012

Я не вижу каких-либо реальных проблем, связанных с исключением в коде, вы можете попробовать:

  • Проверка того, что транзакция сброшена или вызов flush() вручную после совершения;
  • Проверка, передан ли идентификатор в load() и передан ли ему правильный идентификатор через отладчик
  • Включение Hibernate для печати сгенерированного SQL и / или включение ведения журнала
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...