2010-06-11 7 views
0

Je rencontre des problèmes pour renvoyer un Set non vide dans un objet en utilisant Hibernate et une clé CompositeUserType personnalisée.Hibernation, Set de clés, CompositeUserType et procédures SQL

je un ensemble de tables et vues (simplifié ici):

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

et les fonctions de base de données:

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

Donc, pour accomplir ce mapping en utilisant ces fonctions que je devais mettre en œuvre CompositeUserType maintenant J'ai des classes Java comme ceci:

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; } 

Je veux avoir une liste ou ensemble d'auteurs. Mais ne peut pas comprendre comment mapper cette partie dans les fichiers * .hbm.xml. Il semble actuellement quelque chose comme ceci:

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

Mais quand je lance ce session.load(Article.class, pk) sur un article que je connais a des auteurs que je reçois une taille ensemble de zéro. Sinon, je n'ai aucun problème à insérer, mettre à jour, supprimer en utilisant Hibernate, mais maintenant je suis perplexe. Cela me semble indiquer un problème avec mon articleLangPKType.

Des idées quoi faire pour compléter ceci? Pourquoi mon Set est-il toujours de taille 0? Comment est-ce que je sauverais l'auteur en utilisant l'ensemble de l'article et les procédures de SQL comme prévu? Est-ce que Hibernate est bon pour moi? Ai-je besoin d'une pause pour voir cela clairement?

Merci d'avance!

Répondre

0

Nevermind J'ai eu besoin d'une longue pause. Mon articleLangPK n'a pas outrepassé hashCode et est égal à correctement. Maintenant, juste pour comprendre comment appeler ces deux autres procédures stockées correctement.