说明:一个作者写了多篇文章,多个文章属于一个作者
//文章类
class Posts{
private String pid;
private String pname;
private String content;
private User author;
get/set;
}
//作者类
class User {
private String uid;
private String uname;
private Set<Posts> posts ;
get/set;
}
//多对一的配置格式(多个文章对应同一个作者),文章的关系配置文件
<many-to-one name="author" class="cn.test.User" >
<column name="uid"></column> //这里对应多的一方的数据库表中的外键字段名
</many-to-one>
//一对多的配置格式(一个作者对应多个文章),作者的关系配置文件
<set name="posts" cascade="delete" inverse="true" >
<key column="uid" ></key>//这里对应的也是多的一方的数据库表中的外键字段名
<one-to-many class="cn.test.Posts" />
</set>
----------------以上为xxx.hbm.xml 文件中的关系配置,其他省略
lazy:延迟
默认值:true,(默认全部都是延迟加载)
延迟加载机制:会先返回一个代理对象,当真正使用到该对象的某些属性时才会通过之前的那个session去数据库查询数据
所以,要想使用延迟加载,必须保证当你使用数据时session没有关闭,如果session关闭会出现no session 异常,其实就是
延迟加载后回头加载数据时,原来的那个session关闭了的原因。
这里是当父连接加载时同时加载子连接,true代码加载父连接时不加载子连接,当使用到子连接时再去加载,
不过要保证session 没有关闭
多对一和一对多只能存在有一个设置 lazy="false" 延迟加载,不然会产生无限死循环
当然,就算都设置了延迟加载,当调用打印的时候还是有可能进入死循环,尤其当JavaBean都重新了toString方法的时候
级联:
cascade="delete"
在作者的关系配置文件中设置表示,级联删除,当删除一个作者时,会级联删除属于这个作者的所有文章。
cascade:有两种取值
save-update -- 级联保存和更新
delete -- 级联删除
二者可以同时使用,cascade="save-update,delete"
放弃外键维护权:
inverse
取值:默认为false
true -- 放弃外键维护权
false -- 不放弃外键维护权
在作者的配置文件中,inverse="true" 表示作者放弃外键维护权,意思就是这篇文章属不属于该作者,文章说了算,
就是当作者不放弃外键维护权的时候,文章属于谁是作者决定,当作者放弃外键维护权时,文章就有了换作者的权利
(也可能是我了解不够,就目前的了解我是这样理解的,希望了解的朋友多多评论)