在前几章,我们用到都是查询的例子,从来没见过添加的例子。如果您的表是自动增长,在做添加的例子时候会出现异常!~
错误信息:org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.smz.po.Users
意思是说,在save()方法之前必须设置主键id,但是数据库我们设置的是自动增长。如果在程序中添加了ID值,程序不会保存,可数据就会报错的
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'Users' 中的标识列插入显式值。
把第一点看完,您就会明白了。
一.在Hibernate中在生成主键策略有这几个属性:
1.assigned 需要自己设置 --默认
2.identity sqlserver自动增长
3.sequence oracle自动增长
4.increment mysql自动增长
5.native 通用数据库自动增长
现在知道了吧,因为在Hibernate中,默认是assigned,是需要们来设置的。所以只要我们改成identity或者native就可以了。
二.延时加载lazy (默认是true)
<class name="com.smz.po.Users" table="Users" schema="dbo" catalog="myBlog" lazy="false">
举个简单的例子吧,先来看我写的这段代码:
lazy例子,看上面的代码,理论上来说没有一点错误,可在执行的时候,出现了异常:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed
那是因为,Hibernate默认设置lazy是true,也就是说默认是需要延时的。如果我们现在把lazy改为false,看看结果:
正常执行,如果我们不关连接(//session.close()),并且延时(lazy="true"),看看结果会是什么样子。
很明显,sql语句是分段执行的。
三.级联更新和级联删除
在企业管理器是可以设置级联删除和更新的,看看如何操作
表点击右键-->设计表-->右键属性-->选中关系选项卡
当然,Hibernate也提供了练级删除和练级更新
使用属性:cascade="save-update/delete/all"
例如:我删除评论表中的一条评论
在Articles.hbm.xml配置
<many-to-one name="users" class="com.smz.po.Users" fetch="select" cascade="all">
<column name="AuthorId" not-null="true" />
</many-to-one>
当然例子不是很形象,毕竟评论表中可以一个人来评论多次的。这里仅仅为了显示级联删除这个例子。
四.反转inverse
<set name="articleses" inverse="true">
<key>
<column name="AuthorId" not-null="true"/>
</key>
<one-to-many class="com.smz.po.Articles" />
</set>
为true时,表示由对方(one的多方)管理双方的关联关系;为false时,表示自己管理双方的关联关系。默认情况下是true,由多的一方管理一对多的关联关系。