首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >休眠、设置密钥、CompositeUserType和SQL过程

休眠、设置密钥、CompositeUserType和SQL过程
EN

Stack Overflow用户
提问于 2010-06-11 09:23:51
回答 1查看 568关注 0票数 0

我在使用Hibernate和自定义CompositeUserType键将非空集返回到对象时遇到了一些问题。

我有一组表和视图(在这里简化):

代码语言:javascript
复制
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);  

和数据库函数:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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文件中映射这个部分。它目前看起来像这样:

代码语言:javascript
复制
<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适合我吗?我需要休息一下才能看清楚这一点吗?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2010-06-11 22:26:07

不要紧,我确实需要长时间的休息。我的ArticleLangPK没有正确覆盖hashCode和Equals。现在来弄清楚如何正确地调用另外两个存储过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3019619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档