我的一个练手项目,所有登陆用户都存在一个t_user表中,然后,用户的其他信息存在另外一张表中,它们是双向1-1关联。现在想删除t_user表的一条记录的同时删除该用户对应的信息表中的记录,hibernate配置如下:
<!-- 用户表,和老师表、管理员表,学生表都是双向1-1关联 -->
<class name="User" table="t_user">
<id name="id" column="uid">
<generator class="identity"></generator>
</id>
<one-to-one name="admin" property-ref="user" cascade="all"/>
<one-to-one name="teacher" property-ref="user"/>
<one-to-one name="student" property-ref="user"/>
<property name="uname" column="uname"></property>
<property name="upass" column="upass"></property>
<property name="utype" column="utype"></property>
<property name="islogin" column="islogin"></property>
</class>
<!-- 管理员表,和User表双向1-1关联 -->
<class name="Admin" table="t_admin">
<id name="id" column="aid">
<generator class="identity"></generator>
</id>
<many-to-one name="user" unique="true" column="uid" not-null="true"/>
<property name="realname" column="realname"></property>
<property name="birthday" column="birthday"></property>
<property name="sex" column="sex"></property>
<property name="title" column="title"></property>
<property name="email" column="email"></property>
</class>user表和admin表通过外键关联的,hibernate如何在删除user表的记录的同时删除admin表中对应的记录???设置cascade=all也不行,只能删除admin表的记录,如果删除user表会出现约束而无法删除。。求教

解决方案 »

  1.   

    那就在user表设这个admin表的外键,比如admin_id,指向admin表的id,这样 在user删除后,damin表也删除,你试试看能不能达到你的要求
      

  2.   

    user表还关联其他的表
    <one-to-one name="teacher" property-ref="user"/>
    <one-to-one name="student" property-ref="user"/>
      

  3.   

    Hibernae映射继承的方法有:
     (1)每一个具体类对应一个表,在你的系统中抽象类是User,具体类是Teacher,Admin,Student
     所以只需要三个表t_teacher, t_admin, t_student,而抽象类User不需要映射.
     据我观察你不是使用这种方法.
     (2)继承关系中的根类对应一个表,也就是只有一个t_user表,然后使用"判别器"来分辨不同的子类
     虽然你使用了utype字段,但好像你也不是使用这种方法.
     (3)继承关系树的每个类都对应一个表共四张表:t_user, t_teacher, t_admin, t_student.
     你好像在使用这种方法,但是你的映射文件是有问题的.应该是:
     -------------User.hbm.xml--------------------------
     <hibernate-mapping>
     <class name="User" table="t_user">
       <id name="id" column="uid">
         <generator class="identity"></generator>
       </id>
       <property name="uname" column="uname"></property>
       <property name="upass" column="upass"></property>
       <property name="utype" column="utype"></property>
       <property name="islogin" column="islogin"></property>
     </class>
     </hibernate-mapping>
     -------------Admin.hbm.xml--------------------------
     <hibernate-mapping>
       <joined-subclass name="Admin" table="t_admin" extends="User">
        <property name="realname" column="realname"></property>
         <property name="birthday" column="birthday"></property>
         <property name="sex" column="sex"></property>
         <property name="title" column="title"></property>
         <property name="email" column="email"></property>
       </joined-subclass>
     </hibernate-mapping>
     
     但你的配置文件也不是这么写的.先不考虑我上面的内容,单从你的配制文件
     说.
     你说:
     ...."然后,用户的其他信息存在另外一张表中,它们是双向1-1关联".....
     你说它们是1:1的关系,但是你在Admin.hbm.xml中又有如下配制:
     .....
     <many-to-one name="user" unique="true" column="uid" not-null="true"/>
     .....
     
     
     我认为,你先找本数据库设计的书看一下.看一下"主表","从表",等概念.
    我们一起进步!!
     
      

  4.   

    t_user表是主表,利用注入注解:
    @OneToOne(mappedBy="user",fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    其他信息是从表,依然利用注入注解:
    @OneToOne(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH})
    @JoinColumn(name="userid")尽量抛弃“钻木取火”的映射文件,最好改为注入注解。注入注解的功能并不比映射文件差。
      

  5.   

    Admin Teacher Student三个类不是继承自User,User用于保存登录名、密码、用户类型的,,而不同的用户使用另一张表保存个人信息,所以,t_admin、t_student、t_teacher中的每一条记录都是和t_user中的记录对应的,而且是双向1-1关联的。
      

  6.   


    谢谢,新手还是先从xml配置文件入手,熟悉了可以在使用注解嘛