您的位置:首页 > 其它

Hibernate 多对一与一对多关系配置(个人理解)

2017-10-13 19:24 281 查看
说明:一个作者写了多篇文章,多个文章属于一个作者

//文章类
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" 表示作者放弃外键维护权,意思就是这篇文章属不属于该作者,文章说了算,

就是当作者不放弃外键维护权的时候,文章属于谁是作者决定,当作者放弃外键维护权时,文章就有了换作者的权利

(也可能是我了解不够,就目前的了解我是这样理解的,希望了解的朋友多多评论)

$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息