hibernate几个关键字的一点点用法心得

在多表操作中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!!!!!

今天就记录这些吧,其他的还得慢慢研究,任重而道远!





阅读更多
个人分类: 日常笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭