Java 防止外键列中的重复元素

Java 防止外键列中的重复元素,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,使用Hibernate 3.1,并有两个映射文件m_奉献者和m_成员,其类分别为m_奉献者和m_成员。我想避免m_奉献者列奉献者id中的重复条目,该列在m_成员表中被引用为奉献者id外键 我是Hibernate新手,想知道映射中是否缺少一些标记 这是我的档案 目前,我试图通过在dao文件中添加代码来防止重复。这给了我一个ClassCastException。它还应该回滚事务并向servlet返回false,这样它就不会将它转发到其他jsp文件 Query qr1=session.createQu

使用Hibernate 3.1,并有两个映射文件m_奉献者和m_成员,其类分别为m_奉献者和m_成员。我想避免m_奉献者列奉献者id中的重复条目,该列在m_成员表中被引用为奉献者id外键

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

这是我的档案

目前,我试图通过在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());  
 }  
}   
Query qr1=session.createQuery(“从m_成员m中选择m.davideer_id”);
列表l1=qr1.List();
对于(M_成员mi:l1)
{  
if(!(l1.contains(member.get奉献者id()))
{  
member.set奉献者id(member.get奉献者id());
//System.out.println(“打印奉献者id”+member.get奉献者id());
}  
}   
如图所示,穆奉献者对象不能投射给穆成员


我迷路了,非常感谢您的帮助

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

但可以肯定的是,如果你询问野外爱好者的id:

select m.devotee_id from M_member m

你将得到一个奉献者ID列表。不是M_成员的列表。因此,假设奉献者id是一个Long类型的字段,您将得到一个
列表。不是
列表

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

但可以肯定的是,如果你询问野外爱好者的id:

select m.devotee_id from M_member m

你将得到一个奉献者ID列表。不是M_成员的列表。因此,假设奉献者id是一个Long类型的字段,您将得到一个
列表。不是一个
列表

将你的M_成员和M_信徒之间的关联设置为映射为java集合的双向多对一关联。这样,就不需要重复检查,因为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。双向联想

将你的M_成员和M_奉献者之间的关联设置为映射为java集的双向多对一关联。这样,就不需要重复检查,因为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。双向联想

在映射中用unique标记外键,必要时使用自然id或复合id。在映射中用unique标记外键,必要时使用自然id或复合id。