Hibernate, Set keys, CompositeUserType и процедуры SQL - PullRequest
0 голосов
/ 11 июня 2010

У меня возникли проблемы с возвратом непустого набора в объект с использованием Hibernate и пользовательского ключа CompositeUserType.

У меня есть набор таблиц и представлений (здесь упрощенно):

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) для статьи, в которой, как я знаю, есть авторы, я получаю нулевой размер набора. В остальном у меня нет проблем со вставкой, обновлением, удалением с помощью Hibernate, но теперь я в тупике. Мне кажется, это указывает на проблему с моим ArticleLangPKType.

Есть идеи, что делать, чтобы завершить это? Почему мой набор всегда имеет размер 0? Как мне сохранить автора, используя набор статей и процедуры SQL, как предусмотрено? Подходит ли мне Hibernate? Мне нужен перерыв, чтобы это ясно увидеть?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 июня 2010

Не важно, мне нужен был длинный перерыв. Мой ArticleLangPK неправильно переопределил hashCode и Equals. Теперь просто выясним, как правильно вызывать эти две другие хранимые процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...