一:多对一
<many-to-one
1.name:当前类的属性名(关联映射的类)
2.column:属性多对应的类的对应的表的外键(连接条件)
3.class:属性所对应的类的权限定名
4.not-null:不能为空(当持久化当前类对象时,此属性所对应的对象也就是关联映射的对象字段不能为空)
注意:此值为true时,有可能报PropertyValueException:当持久化当前类,当前类被存入数据库,而关联字段对象没有存入数据库,但关联字段又不能为空,则导致异常
当从数据库查询出当前类,但是关联字段对象在关联表里面找不到,导致关联字段对象为null也会报异常
5.lazy:延迟加载(加载当前类对象时不加载该关联映射的对象,直到使用到此字段时才加载关联映射对象)
6.cascade:save-update(级联更新):持久化当前类对象时自动持久化所有关联对象字段(注意:当持久化当前类对象时,默认不会持久化关联对象);类似的还有:delete级联删除;none:无;
级联设置为:all-delete-orphan(all+delete-orphan):当存在父子关系时,父方的cascade设置为此值,子对象必须和一个父对象关联,不允许单独存在,如果删除父对象,所有关联的子对象需删除
所有的操作都级联(删除,更新,游离对象等),如需设置则设置为:evict,delete,save-update等
/>
fetch属性:
有两个可选值:join和select
这个属性决定了你在查询的时候,是先查主表记录再查关联记录,还是要把关联表的记录一起查询出来。
select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询
如果lazy=true(延迟加载),select在查询时只会查出主表记录,用到了关联数据时再自动在执行查询
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
二:一对多
<set name: cascade: inverse:>
<key column=/>
<one-to-many class=/>
<set/>
inverse属性:
当出现双向关联时:如果修改双向关联中的某一个对象值,由于有双向关联,则双方对象的属性值都发生了改变,则hibernate会在两方各执行一次更新语句来更新表,实际上对于数据库来说只需要执行一次即可;
因此:在一对多的双向关联时,在"one"方设置inverse=true,来提高性能;在建立两个对象的双向关联时,同时修改关联两端的对象的相应属性
Hibernate中的inverse在表关系映射中经常应用 inverse的值有两种,“true”和“false”。inverse="false"是默认的值 inverse的作用:在hibernate中是通过inverse的设置来决定是有谁来维护表和表之间的关系的。 我们说 inverse设立不当会导致性能低下,其实是说inverse设立不当,会产生多余重复的SQL语句甚至致使JDBC exception的throw。这是我们在建立实体类关系时必须需要关注的地方。一般来说,inverse=true是推荐使用,双向关联中双方都设置 inverse=false的话,必会导致双方都重复更新同一个关系。但是如果双方都设立inverse=true的话,双方都不维护关系的更新,这也是 不行的,好在一对多中的一端:many-to-one默认是inverse=false,避免了这种错误的产生。但是多对多就没有这个默认设置了,所以很 多人经常在多对多的两端都使用inverse=true,结果导致连接表的数据根本没有记录,就是因为他们双分都没有责任维护关系。所以说,双向关联中最 好的设置是一端为inverse=true,一端为inverse=false。一般inverse=false会放在多的一端,那么有人提问了, many-to-many两边都是多的,inverse到底放在哪儿?其实hibernate建立多对多关系也是将他们分离成两个一对多关系,中间连接一个连接表。所以通用存在一对多的关系,也可以这样说:一对多是多对多的基本组成部分
注意:set关联属性最好直接初始化new hashSet()以免产生null异常