在多表操作中hibernate是一个很实用的框架,单表就用JDBC,C3P0就行了,没必要使用框架,框架运行还是比较迟钝的,涉及到数据库操作无非便是增删改查CRUD,下面我就简单记录一下,反正我能看懂会用就可以了
1,inverse,这个在xml的配置文件中,经过操作,发现删除跟inverse的设置似乎根本就没有关系一样,但是对于其他诸如添加还是很重要的,后面会附上几个文件以备看到的人测试用,我的总结是:inverse配置在谁那里,谁就有权利去修改数据库。简单来说,多对多的两张表,擦!说不明白,上代码吧:
a,在user表中设置inverse(true),role表中不设置inverse(false)
user表:
<set name="roles" table="sys_user_role" inverse="true" cascade="all" lazy="extra">
<key column="user_id"/><!--配置的是该对象在中间表的外键 -->
<!--class值得是属性中的变量类型 column值得是class类在中间表的外键 -->
<many-to-many class="cn.itcast.entity.RoleInfo" column="role_id"/>
</set>
role表:
<set name="users" table="sys_user_role" cascade="all" >
<key column="role_id"/>
<many-to-many class="cn.itcast.entity.UserInfo" column="user_id"/>
</set>
那么操作的时候,如果想要运行成功,那么如下操作是可以成功的,但是将保存的对象换成是role的就会报错
ConstraintViolationException: could not execute statement: fuck!i hate this!!!!!
Transaction tx = session.beginTransaction();
/*session.save(r1);
session.save(r2);
session.save(r3);*/
session.save(user1);
session.save(user2);
tx.commit();
System.out.println("保存成功!");
b,那你说两个都设置成inverse(true)行不行呢?可以的!reverse完
2,cascade,这个属性很重要,毕竟在设计到JPA这个属性也是很中要的,解释一下,它的意思是串联的意思,不设置,那两个对象就跟表的RM(关联)关系建立不起来,一般来讲,增加修改这类操作跟着inverse跑基本上就没有问题了,如下:
user表
<set name="roles" table="sys_user_role" inverse="true" lazy="extra" cascade="all">
<key column="user_id"/><!--配置的是该对象在中间表的外键 -->
<!--class值得是属性中的变量类型 column值得是class类在中间表的外键 -->
<many-to-many class="cn.itcast.entity.RoleInfo" column="role_id"/>
</set>
role表
<set name="users" table="sys_user_role" >
<key column="role_id"/>
<many-to-many class="cn.itcast.entity.UserInfo" column="user_id"/>
</set>
user = session.get(UserInfo.class, 29l);
if (null!=user) {
Transaction tx = session.beginTransaction();
try {
session.delete(user);
tx.commit();
System.out.println("删除成功");
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}
}
这个操作是没问题的,但是要知道删除的面积是非常巨大的,user和role能通过这一个查询条件联系上的全部被干掉了,我的天呐!!所以轻易的不要去删除数据,能标记的就标记就好了。。。。
b, 但是,在删除的操作上关联关系还是和inverse类似的,比方说在role中设置了一个cascade属性,而user中没有,你查出来user,然后进行删除操作那就会报错,原因是,它根本不去查跟user相关联的role。啪啪把你要查的user查到了,关联的role都没管,结果删除user的时候遇到了外键约束,废了,回头control还会给你抛一个:
ConstraintViolationException: could not execute statement: fuck!i hate this!!!!!
今天就记录这些吧,其他的还得慢慢研究,任重而道远!