初学者Hibernate问题 - 简单映射与非简单异常!

时间:2011-07-05 08:53:43

标签: java hibernate exception

请帮助我解决这个休眠问题,我是新手来休眠,但仍然试图解决这个问题。我似乎无法解决这个问题。我想我错过了一些非常简单的东西。

我按照此处的示例实现了多对一映射,因为我的要求几乎相同:http://www.coderanch.com/t/217519/ORM/java/Hibernate-Newbie-Many-Relation-Tutorial

请注意,当我尝试保留Picture对象时,用户变量(在该时间点)为空,与其他每个变量条形图一样。

另请注意,我已将hibernate设置为通过hibernate配置文件中的config自行生成数据库模式。

以下是我的映射文件(已删除声明)

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>

类文件(getter和setter剥离)

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 个答案:

答案 0 :(得分:1)

如果这是你得到的真正错误,会发生一些非常奇怪的事情。

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。

答案 1 :(得分:0)

在保存用户之前,您似乎正在尝试保存图片。尝试先保存用户。

<强> [编辑]

从映射 - 看起来用户和图片之间存在父/子关系。

亲子关系的Hibernate Documentation有一个很好的例子。

如果您希望用户能够为空,那么单向关系会更好。

<强> [编辑]

Hibernate的另一个good reference about mapping collections