Задача новичков Hibernate - простое сопоставление с непростым исключением! - PullRequest
1 голос
/ 05 июля 2011

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

Я следовал приведенному здесь примеру, чтобы получить сопоставление «многие к одному», поскольку мои требования почти идентичны: http://www.coderanch.com/t/217519/ORM/java/Hibernate-Newbie-Many-Relation-Tutorial

Обратите внимание, что когда я пытаюсь сохранить объект Picture, пользовательская переменная (на тот момент) пуста, как и все остальные переменные изображения.

Также обратите внимание, что я установил hibernate для генерации схемы базы данных самостоятельно через config в файле конфигурации hibernate.

Вот мои файлы сопоставления (объявления удалены)

User.hbm.xml

<class name="msc.model.User" table="USER">
    <id name="id" column="USER_ID">
        <generator class="native"/>
    </id>
    <property name="username"/>
    <property name="email"/>

    <bag name="pictures"  
       table="PICTURE"  
       lazy="true"  
       cascade="save-update">  
        <key column="PICTURE_ID"/>  
        <one-to-many class="msc.model.Picture" />  
    </bag>

</class>

и Picture.hbm.xml

<class name="msc.model.Picture" table="PICTURE">
    <id name="id" column="PICTURE_ID">
        <generator class="native"/>
    </id>
    <property name="story"/>
    <property name="tattooist"/>
    <property name="pic"/>

    <many-to-one name="user"  
           class="msc.model.User"  
           column="USER" />     

    <property name="image" type="blob">
        <column name="IMAGE" not-null="true" />
    </property>    

</class>

Файлы классов (геттеры и сеттеры удалены)

Picture.java

package msc.model;

import java.io.File;
import java.sql.Blob;

public class Picture {

private Long id = null;
private User user = null;
private File pic = null;
private String story = null;
private String tattooist = null;
private Blob image = null;
}

User.java

package msc.model;

import java.util.ArrayList;
import java.util.List;

public class User {

private Long id = null;
private String username = null;
private String email = null;
private List<Picture> pictures = null;
}

Код персистентности (обратите внимание, что bFile - это поток байтов, созданный из файла):

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

    hib_ses.beginTransaction();
    Picture picture = new Picture();
    picture.setImage(Hibernate.createBlob(bFile));

    Long id = (Long) hib_ses.save(picture);

    hib_ses.getTransaction().commit();

Вот исключение:

Cannot add or update a child row: a foreign key constraint fails (`msc`.`picture`, CONSTRAINT `FK85BE8DE2885129D` FOREIGN KEY (`PICTURE_ID`) REFERENCES `user` (`USER_ID`))

Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Если происходит настоящая ошибка, происходит что-то очень странное.

Cannot add or update a child row: a foreign key constraint fails (`msc`.`picture`, CONSTRAINT `FK85BE8DE2885129D` FOREIGN KEY (`PICTURE_ID`) REFERENCES `user` (`USER_ID`))

Это говорит о том, что PICTURE.PICTURE_ID является ссылкой на USER.USER_ID. Но PICTURE_ID - это PK изображения, которое Hibernate сгенерирует при вставке. Вы хотели создать ограничение от PICTURE.USER до USER.USER_ID?

О, я вижу, вы написали, что генерируете схему через Hibernate. Я думаю, что ошибка в вашем определении "мешок". Ключевым столбцом должен быть не PICTURE_ID, а USER.

0 голосов
/ 05 июля 2011

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

[править]

Из сопоставления - похоже, что есть отношение Родитель / Дитя между Пользователем и Картинкой.

В документации Hibernate есть хороший пример отношения Родитель-ребенок.

Если вы хотите, чтобы пользователь мог быть нулевым, тогда однонаправленные отношения были бы лучше.

[править]

Еще одна хорошая справка о сопоставлении коллекций с Hibernate.

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