使用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,如此处所示。
我迷路了,任何帮助都非常感谢!
答案 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