Hibernate とカスタム CompositeUserType キーを使用して空でない Set をオブジェクトに返すのに問題があります。
私は一連のテーブルとビューを持っています(ここでは簡略化されています):
create table lang (lang_id,lang_cd);
create table article (art_id,...);
create table article_lang (art_id, lang_id,title,...);
create view article_lang_vw (select * from article join article_lang on art_id);
create table authors(user_id,...);
create table article_authors(art_id,lang_id,user_id);
データベース機能:
create or replace procedure addarticle(title,art_id,lang_id) ...
create or replace procedure updatearticle(title,art_id,lang_id)..
create or replace procedure delarticle(art_id,lang_id)..
create or replace procedure addarticleauthor(user_id,art_id,lang_id)...
create or replace procedure delarticleauthor(user_id,art_id,lang_id)...
したがって、これらの関数を使用してこのマッピングを実現するには、実装する必要があったCompositeUserType
ため、次のような Java クラスを用意しました。
class ProcedureGenerator implements PostInsertIdentityGenerator ...
class Language { int lang_id }
class ArticleLangPKType implements CompositeUserType { //implemented methods }
class ArticleLangPK { int art_id; Language l; }
class Article { ArticleLangPK id; String title; Set<Author> authors; }
class Author { int user_id; String name; }
著者のリストまたはセットが必要です。ただし、この部分を *.hbm.xml ファイルにマップする方法がわかりません。現在、次のようになっています。
<class name="Author" mutable="false">
<id name="user_id"/>
<property name="name"/>
</class>
<class name="Article">
<id name="id" type="ArticleLangPKType">
<column name="art_id"/>
<column name="lang_id"/>
<generator class="ProcedureGenerator"/>
</id>
<property name="title"/>
<set name="authors" table="article_authors">
<key> <!-- <key type="ArticleLangPKType"> -->
<column name="art_id"/>
<column name="lang_id"/>
</key>
<many-to-many class="Author" table="article_authors" unique="true"/>
<!-- addauthor, delauthor sql here some how -->
</set>
<sql-insert callable="true">{call addarticle(?,?,?)}</sql-insert>
<sql-update callable="true">{call updatearticle(?,?,?)}</sql-update>
<sql-delete callable="true">{call adddelete(?,?)}</sql-delete>
</class>
しかし、session.load(Article.class, pk)
著者がいることがわかっている記事でこれを実行すると、 Set サイズがゼロになります。それ以外の場合は、Hibernate を使用して挿入、更新、削除に問題はありませんが、今は困惑しています。これは私の ArticleLangPKType に問題があることを示しているように思えます。
これを完了するために何をすべきか考えていますか? セットのサイズが常に 0 なのはなぜですか? Article's Set と提供されている SQL プロシージャを使用して著者を保存するにはどうすればよいですか? Hibernate は私に適していますか? これをはっきりと見るには休憩が必要ですか?
前もって感謝します!