request_getAttribute 2017-06-27 10:12 采纳率: 0%
浏览 1240

hibernate框架里面的inverse属性的作用是什么??能详细说明不??

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 设置包名 -->

<!-- class标签的name属性表示类 table属性表示这个类对应那个表,表名可以不写因为默认的表名就是类的名字 -->
<class name="Department" table="department"><!-- 设置User类对应哪一张表 -->
    <id name="id" column="departmentId">
    <!-- 设置user对象中的id属性对应表里面的哪一个字段,当然这里是对应主键所以就用id标签 
        name属性表示user对象中的属性 type表示字段的类型 column表示对应数据库中的主键
    -->

        <generator class="native"></generator>

    </id>
    <property name="name"/>

    <!-- employee属性是一个set集合 ,一对多,table代表表的名字默认为name的属性值
    key代表关联那个外键 one-to-many代表一对多 class属性表示引用那个类的对应的表多的一方
    inverse的值默认为false,如果是true则代表这个表不维护关联关系,交给对方表来维护关联关系
    inverse只是影响是否能设置外键的值(设置成有效值或者null)对获取信息没有影响
    -->
    <set name="employees" inverse="false">
        <key column="departmentId"></key>
        <one-to-many class="Employee"></one-to-many>
    </set>

</class>


‘’

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 设置包名 -->

<!-- class标签的name属性表示类 table属性表示这个类对应那个表,表名可以不写因为默认的表名就是类的名字 -->
<class name="Employee" table="employee"><!-- 设置User类对应哪一张表 -->
    <id name="id">
    <!-- 设置user对象中的id属性对应表里面的哪一个字段,当然这里是对应主键所以就用id标签 
        name属性表示user对象中的属性 type表示字段的类型 column表示对应数据库中的主键
    -->

        <generator class="native"></generator>

    </id>
    <property name="name" type="string" column="name" not-null="true" length="200"/>
    <!--String类型的数据对应mysql里面的varchar类型 
    由于name在表里不是主键所以就用property标签 name属性里的值就是写user对象里面的属性这个属性要和数据库中的字段对应,
    column属性就是设置数据库中对应的字段 ,not-null就是非空约束-->

    <!-- 多对一   class代表引用哪个类的的对应表作为一的一方column表示外键的字段名-->
    <many-to-one name="department" class="Department" column="departmentId">


    </many-to-one>

</class>

 public static void main(String args[]){
//      解除关联关系

        Session s=sf.openSession();
        s.beginTransaction();
//      删除员工(多方) 对一的一方没有影响
        Employee e=(Employee)s.get(Employee.class,45);
        s.delete(e);

        /*
         * Hibernate: 
            select
                department0_.departmentId as departme1_0_0_,
                department0_.name as name0_0_ 
            from
                department department0_ 
            where
                department0_.departmentId=?
            Hibernate: 
                delete 
                from
                    department 
                where
                    departmentId=?

         如果有关联的员工且inverse=false由于不能维护关联关系,所有会直接进行删除,但是由于主键约束所有报异常
        如果有关联的员工且inverse=true由于交由员工表维护关联关系,所有就先将员工表里面的对应数据掷为null了再把部门表里面的数据删除
         */
//      删除部门(一方) 先将关联id字段的其他表里的记录给掷为null,再将其删除
        Department d=(Department)s.get(Department.class,18);
        s.delete(d);

        s.getTransaction().commit();
        s.close();
    }

我就是这样想,就是当这个值为true的时候是不是将关联关系交与其他表来维护?我不懂这句话的意思,我这里部门表被员工表关联了,是不是说部门表删了一个数据,员工表将对应的外键给掷为null??总之我就是不太懂这个inverse的意思,我是刚用csdn不久所以不太会用

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-06-27 17:17
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3