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

现在,我试图通过在我的 dao 文件中添加代码来防止重复。它给了我一个 ClassCastException。它还应该回滚事务并向 servlet 返回 false,因此它不会将其转发到其他 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 ,如此处所示。

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

4

2 回答 2

2

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

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

select m.devotee_id from M_member m

您将得到一个奉献者 ID 列表。不是 M_member 的列表。因此,假设 devotee_id 是 Long 类型的字段,您将得到一个List<Long>. 不是一个List<M_member>

于 2012-07-18T20:26:02.207 回答
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

于 2012-07-18T20:51:11.997 回答