1

DB2データベースとHibernateフレームワークを使用しています。WordとLitterなどの2つのテーブルがあり、それらの関係は1対多です。

  1. スキーマA:

    Table Word: ID,
    IDLIT -> references to ID of Litter table
    Name
    
  2. スキーマB:

    Table Litter ID,
    Short_Name,
    Long_Name.
    

両方のテーブルは2つの異なるスキーマにありますが、1つのデータベースにあります。テーブルをマップするためのPOJOおよびXMLマッピングファイルがあります。多対1の関係(Litter-Word)を処理しながら、オブジェクトをデータベースに保存するにはどうすればよいですか?何か提案はありますか?はいの場合は、詳細な手順を教えてください。よろしくお願いします。

更新された質問

また、マッピングxmlファイルがPOJOクラスごとに異なるため、変更しました。実行するためのコードは次のとおりです。

 Session session = HibernateUtility.getSessionFactory().openSession();
   session.beginTransaction();

   Word word = new Word();
   Word word1 =new Word();

   Litter litter = new Litter();
   litter.setFullname("bla bla");
   word.setLitter(litter);    
   word1.setLitter(litter); //Here I have to handle one to many relationship

   Set Words =new  HashSet();
   Words.add(word);
   Words.add(word1);
   litter.setWords(words);
   session.save(litter);
   session.save(word);
   session.save(word1);
  session.getTransaction().commit();
  session.close();

しかし、例外を与えるこのコード:JDBCExceptionReporter logExceptions私が使用しているアプローチは正しいですか?

スタックトレース -  -  -  -  -  -  -  -  - 
情報:スキーマの更新が完了しました
Hibernate:LITTERからmax(ID)を選択します
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
警告:SQLエラー:-204、SQLState:42704
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
重大:DB2 SQLエラー:SQLCODE = -204、SQLSTATE = 42704、SQLERRMC = BIMASH.LITTER、DRIVER = 3.64.104
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
警告:SQLエラー:-204、SQLState:42704
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
重大:DB2 SQLエラー:SQLCODE = -204、SQLSTATE = 42704、SQLERRMC = BIMASH.LITTER、DRIVER = 3.64.104
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
警告:SQLエラー:-727、SQLState:56098
сен25、2012 7:33:42 PM org.hibernate.util.JDBCExceptionReporter logExceptions
重大:DB2 SQLエラー:SQLCODE = -727、SQLSTATE = 56098、SQLERRMC = 2; -204; 42704; BIMASH.LITTER、DRIVER = 3.64.104
スレッド「main」の例外org.hibernate.exception.SQLGrammarException:増分ジェネレーターの初期値をフェッチできませんでした
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)で
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)で
    org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:107)で
    org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:44)で
    org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)で
    org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)で
    org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)で
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)で
    org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)で
    org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)で
    org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)で
    Main.main(Main.java:73)で
4

1 に答える 1

0

You can define the schema a mapped class belongs to with the schema attribute of the <class> element in the mapping file. Notice this will override the setting in the general <hibernate-mapping>'s schema attribute.

<!-- A is set to be the default schema -->
<hibernate-mapping schema="A">
    <class name="mypackage.Word" table="WORD" >
    ....
    </class>

    <!-- Overriding the schema definition for this class -->
    <class name="mypackage.Litter" table="LITTER" schema="B">
    ....
    </class>
</hibernate-mapping>

The following Hibernate reference chapter might be worth a read: Chapter 5. Basic O/R Mapping, specially the sections about the <hibernate-mapping> and <class> elements.

UPDATE

Seeing the stack trace, it seems that a <generator class="increment"> is being used in the class. If it's the case (it seems so by the select max(ID) from LITTER query), you'll also have to specify the schema in the <generator> so that the issued query transforms into select max(ID) from B.LITTER. You can achieve that with a <param> named schema in the <generator>:

<generator class="increment">
    <param name="schema">B</param>
</generator>

For more details see this almost duplicate question: Hibernate: ID generator using increment and Oracle Schema

于 2012-09-25T09:58:40.203 に答える