对象与映射关系总结2
一:一对一的关系
步骤:1、建立Hibernate-cfg.xml文件
2、建立一对一对象Customer和CardID
在建立对象Customer 和CardID时
A.Customer类里要把CardID对象组合进来,并且不能初始化!
否则会报java.lang.StackOverflowError的异常
(为什么要报此错,并不理解!)
B.CardID类里面要把Customer组合进来,在此类里,无论初不初始化,都不会报异常!
3、在数据库中建立对应的表
4、建立Customer.hbm.xml对象和关系映射文件
A、在此映射文件里generator主键生成器要设为assigned(主键由外部程序生成,无需hibernate参与)
B、在<one-to-one> 里面cascade(级联)要设置成all
5、建立CardID.hbm.xml
A、在此映射文件里generator主键生成器要设为foreign(使用外部表的字段作为主键。)
并且要在此标签里加上<param name="property">customer(Customer类指定的引用的属性)</param>标签
6、建立OneToOneService(业务操作类)
二:多对一的关系
步骤:1、建立Hibernate-cfg.xml文件
2、建立多对一对象Customer和Order
3、建立数据库中的表
在 Order类里面把Customer类组合进来,Customer类可以初始化,也可以不初始化
(具体原因就是:不是很清楚)
4、建立Order.hbm.xml对象与关系映射文件
A、在此映射文件里generator主键生成器要设为assigned(主键由外部程序生成,无需hibernate参与)
B、并且在此文件里的<many-to-one>的标签中最好是不要设置cascade
但要设置column="外键"
(因为多对一的关系,多方的多条记录可能对于一方的一条记录,所以插入、更新、删除等操作时,不需要级联操作
)
5、建立业务操作类
三、一对多的关系
步骤:1、建立Hibernate-cfg.xml文件
2、建立多对一对象PublishHouse和Book
在PublishHouse中利用set集合讲Book组合进来
3、建立对象与关系映射文件
4、 建立数据库中的表
A. 在多的一方Book.hbm.xml中配置很简单
只有id(id中有generator)和property
B.在一的那方必须配置
<set name="bookSet" table="t_book" cascade="all">
<key column="PID"></key>
<one-to-many class="com.lovo.hibernate.OneToMany.Book"/>
</set>
5、建立业务操作类
四、多对多的关系
用两个一对多的关系配置就可以得到!
(但最重要的是cascade 和inverse的配置)
总结:
一、
get 和 load
A、get
1、在一级缓存中找Book 的代理Proxy
2、如果找不到就到数据库中去找
3、若数据中没有数据则返回null(这个与一级缓存无关)
4、如果数据库中有数据在一级缓存中就会创建代理对象
(是填充了数据的代理)
B、load
1、如果在一级缓存中找,如果找到了就什么都不做了
2、如果找不到的话就创建代理并且设置OID(与数据库无关,只跟一级缓存有关)
3、无论是对代理对象的任何方法,都会触发查找数据库(例如在代理中调用tostring)
(注意是否到二级缓存去找,根据配置来定,二级缓存没有空的代理)
二、cascade和inverse
1、cascade是级联、就是插入,修改,删除等操作会不会影响另外一个
Cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
2、inverse
很难理解,反正一边true,一边就要设置成false,
具体的理解,我在另外的一章总结中做了详细的总结!