防止外键列中的重复元素

时间:2012-07-18 19:33:04

标签: java hibernate java-ee

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

目前,我试图通过在我的dao文件中添加代码来防止重复。它给了我一个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,如此处所示。

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

2 个答案:

答案 0 :(得分:2)

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

但可以肯定的是,如果您查询字段devotee_id:

select m.devotee_id from M_member m

您将获得的结果将是奉献者ID列表。不是M_member列表。因此,假设devotee_id是Long类型的字段,那么您将获得List<Long>。不是List<M_member>

答案 1 :(得分: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 docs 7.3.2。双向关联 http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html#collections-bidirectional