前边我们讲过了Hibernate的hbm.xml文件,这是一个描述Java中类和数据库中表之间映射关系的文件。我们具体讲了几个节点hibernate-mapping,class,id,property和时间日期映射关系,大对象映射关系这三点的内容。
对于hibernate-mapping我们可以为其添加属性package指明以下的使用到的类默认在这个包下,就不用写类的全类名了。对于class这个节点,我们可以通过指定属性dynamic-insert和dynamic-update来采取动态插入和动态更新的操作数据库的策略,同时还可以指定属性update-before-select=true在更新游离对象时检验是否发送update语句。id这个节点描述的是类中的属性和表中的主键的对象标识符的映射关系。其中需要注意的是其子节点generator来描述表中的主键的生成方式,通常我们采用native的生成方式,即根据数据库本地的策略采取identify,sequence,hilo等策略来指定主键的生成策略。property这个节点描述的是Java普通属性和表中普通字段的映射关系,他有acess(指定或者去类属性的方式、type(指定属性的类型)、unique(指定该属性对应的列添加一个唯一约束)、update(指定该字段是否可改)、index(指定该列名上的索引)、formula(指定该列是通过什么样的SQL表达式生成的)。
对于时间日期类型的映射,因为java.util.Date是所有时间日期类型的父类,所以可匹配任意类型,所以我们在声明Java类中时间日期类型的属性时,采用java.util.Date类型。
对于大对象来说,我们一般不将其存入数据库,而是通过在数据库中指定一个url或者path指向存放于程序目录下的大文件,如:图片,大文本(长度超过255字节)。
今天我们来讲一讲Hibernate中的单向多对一的关联关系。
在领域模型中,类与类之间最普遍的关系就是关联关系,而且,关联是有方向的。
1.我们一Order和Customer为例:
需求:多个订单可以对应一个客户
域模型:Order类中存在一个Customer的引用变量
数据关系模型:orders表中存在一个外键指向customers表中的主键
其中,最关键的一步就是如何将Order类中的Customer属性描述成指向customers表的主键的外键
<many-to-one name="Order类customer属性名" class="属性的类型" >
<column name = "customers表的主键CUSTOMER_ID">
</many-to-one> .
2.测试生成的多对一关联关系的CURD操作
① 保存:两个对象
当我们先保存外键的一端时,会发送两条insert,一条update因为这个对象在进数据库时不确定主键,等到含主键的对象插入后,再更新外键对象的关联关系。若是先保存不含外键的一端,则两条insert。从效率上来看,我们应该先插入一的不含外键的一端的对象。
② 查询
当我们查询函外键的一端时,默认只会查询多一端的对象,当我们使用多端对象关联的一端的对象时,才会发送SQL将一端的对象也查询出来。这种方式成为延迟加载,又叫懒加载,当我们在获取一端对象前将session关闭了,就会发生懒加载异常。
默认通过多端对象获取的一端对象时Hibernate提供的一个代理对象。
③ 删除
当我们删除一个多的一端的对象时,是没有问题,但是当我们删除一个一的一端的对象时,在不设置级联情况下,若这条数据在多的一端有对应的外键进行关联,那么就是不可以删除的。即自身主键被其他表的外键依赖时,这个对象是不可以删除的,除非我们设置级联属性将关联的数据对象一起删除。