2011-07-05 11 views
1

この休止状態の問題で私を助けてください。私は休止状態に慣れていて、それでも私の頭を抱えようとしています。私はこの問題を解決することができません。私はかなり簡単な何かを見逃していると思います。初心者のHibernateの問題 - 単純ではない例外を使った簡単なマッピング!

私の要件はほとんど同じであるため、私は、多対1のマッピングを実現するために、ここでの例を踏襲してきました: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です0

<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`)) 

助けてください!

答えて

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である必要があります。

0

ユーザーを保存する前に画像を保存しようとしているようです。最初にユーザーを保存してみてください。

[編集]

マッピングから - ユーザーと画像間の親/子関係があるように見えます。

Hibernate Documentationには、親子関係の良い例があります。

ユーザーがNULLになることができるようにするには、一方向の関係が良いでしょう。

[編集]

Hibernateで別のgood reference about mapping collections

+0

問題は、まだユーザーを保存したくないということです。アプリの要件により、まだユーザーデータがありません。私はこのようにして何か間違っているのですか? –

+0

私はマッピングが、ユーザーがPictureの中に必要とされていると言っていると思います。私はあなたのためのドキュメントのリンクを見つけようとします。 – Rachel

関連する問題