2012-07-18 52 views
0

使用Hibernate 3.1并且有两个映射文件m_devotee和m_member,它们具有类M_devotee和M_member。我想避免m_devotee列中的重复条目devotee_id在m_member表中被引用为devotee_id外键。防止外键列中出现重复元素

我是Hibernate的新手,想知道我是否在映射中缺少一些标记。

这里是我的文件,https://gist.github.com/2e2560e7a04a769848a4

现在,我试图阻止重复在吾道文件中添加代码。它给了我一个ClassCastException。它还应该回滚事务并将false返回给servlet,以便它不会将其转发给其他jsp文件。

Query qr1=session.createQuery("select m.devotee_id from M_member m"); 
List<M_member> l1=qr1.list(); 
for(M_member mi:l1) 
{ 
if(!(l1.contains(member.getDevotee_id()))) 
{ 
    member.setDevotee_id(member.getDevotee_id()); 
//System.out.println("print devotee id"+member.getDevotee_id()); 
} 
} 

M_devotee对象不能转换为M_member,如此处所示。

我迷路了,任何帮助都非常感谢!

+0

将您的外键标记在唯一的映射中,或者在必要时使用自然标识或复合标识。 – djmj 2012-07-19 01:56:50

回答

2

这不是很清楚,在我看来你错过了关于关联的手册部分(以及关于命名约定的Java手册的一部分)。

但是,什么是肯定的是,如果你查询的字段devotee_id:

select m.devotee_id from M_member m 

什么,你会得到的结果将是奉献者ID列表。不是M_member的列表。所以,假设devotee_id是一个Long类型的字段,你会得到一个List<Long>。不是List<M_member>

1

将M_member和M_devotee之间的关联设置为映射为java Set的双向多对一关联。这样,就不需要重复检查,因为Set接口保证只向集合添加一次值。

<class name="Parent"> 
    <id name="id" column="parent_id"/> 
    .... 
    <set name="children" inverse="true"> 
     <key column="parent_id"/> 
     <one-to-many class="Child"/> 
    </set> 
</class> 

<class name="Child"> 
    <id name="id" column="child_id"/> 
    .... 
    <many-to-one name="parent" 
     class="Parent" 
     column="parent_id" 
     not-null="true"/> 
</class> 

查看Hibernate文档7.3.2。双向关联 http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-bidirectional