Hibernate学习记录2

15. dynamic-insert
在save操作的时候,打印出来的insert的sql语句中,即使没有值的字段也会出现在sql语句中,如果想没有值的字段不出现在sql语句中可以在映射文件的class属性配置dynamic-insert=true来设置

16.increment标识符生成器
1.使用该标识符生成器时,hibernate会先查出主键中的最大值(hibernate会使用select max(id) ... 来查找),当插入数据的时候,会在最大值的基础上+1。
2.该生成器的字段类型必须是int,long或者short类型
3.并发的情况下不适用

17.identity标识符生成器
1.该生成器要求底层数据库将主键定义成自增长字段类型,所以其依赖于底层数据库
2.该生成器的字段类型必须是int,long或者short类型

18.formula映射派生属性
这个属性不需要在数据库中有对应的列,只在实体类中存在,其值是在运行时得到的,可以在formula中写sql语句得到值,用法如下
<property name="studentInfo" formula="(select concat(school,'-',studentid,'-',name) from student st where st.studentId = studentId)" />
formula中的()是必须的,在其中填写sql语句,在这里是把数据库里的3个列的值赋值到studentInfo中
Student s = (Student) session.get(Student.class, 1);
System.out.println(s.getStudentInfo());
这样StudengInfo也还会根据3个字段得到相应的值

19.组件映射
例:一个Work里有一个Pay属性,映射时需要使用component标签如
<component name="pay">
<property name="payMonth" type="java.lang.Integer" column="payMonth" />
<property name="payYear" type="java.lang.Integer" column="payYear" />
</component>
和class标签类似

20.单向多对一关联
例:一个Customer对应多个Order
1.
实体类中Order类的有一个Customer的对象成员
Customer的配置文件和普通类的文件一样,而Order的配置文件多了如下标签:
<many-to-one name="customer" class="Customer" column="CUSTOMERID">
</many-to-one>
column是数据库表中的外键列,对应customer表里的customerid列
2.
在进行save操作的时候,如果先保存多的一端,则会有3条insert语句,2条update语句(2个Order对象,1个Customer对象),因为保存order的时候,customerid还不知道,需要等customer插入后才知道,这时需要update更新外键列的值。若先插入一的一端,则不会出现这种情况

21.双向一对多(双向多对一)
1.集合类型必须是接口类型,如set
2.和单向多对一关联类似,Order的配置文件一样,而Customer的配置文件中要加入如下标签
<set name="orders" table="ORDER_TABLE" inverse="true">
<key column="CUSTOMERID"></key>
<one-to-many class="Order"/>
</set>
这是一的一端
3.由于是一对多,所以,多的一端需要有一个表来保存,table表示该表,与多的一端的配置文件一样对应,而key表示该表中的外键,与
<many-to-one name="customer" class="Customer" column="CUSTOMERID">
</many-to-one>
中的column对应
4.先保存多的一端,再保存多的一端会多出2条update语句(和20原因一样),先保存一的一端则会少了这两条语句,但是还是会有update语句,这是因为这中情况下是一的一端来控制关联关系(一般由多的一端来控制关联关联),只需要在set中加入inverse="true",之后一的一端就不会控制关联关系,update语句就不会再出现了

22.基于外键关联的双向一对一
1.基于外键关联的双向一对一用一个外键来关联两个表(外键在哪个表中根据需求),一个配置文件使用<one-to-one>,而另外一个配置文件使用<many-to-one unique="true">,如下
<one-to-one name="department" class="Department" property-ref="manager"/>
<many-to-one name="manager" class="Manager" column="mgrId" unique="true"/>
外键存在于many-to-one的一方
2.property-ref
该属性用来指定关联字段,如果不指定,则默认为关联类的主键,如上,如果不指定property-ref,则连接的时候为manager.managerid = department.departmentid,指定后为manager.managerid = department.xxxx(property-ref指定的,在这里应该是mgrId)

22.基于主键关联的双向一对一
1.这种关联有一方不需要自己指定主键生成策略,而是主键参照关联类的主键,此时主键配置如下:
<id name="departmentId" type="java.lang.Integer" column="DEPARTMENTID">
<generator class="foreign" >
<param name="property">manager</param>
</generator>
</id>
此时不再是native,而是foreign,然后再param中指定当前类的哪个属性所对应的主键作为参照主键
2.然后两方都使用one-to-one,如下
<one-to-one name="manager" class="Manager" constrained="true"/>
<one-to-one name="department" class="Department" property-ref="manager"/>
而在不需要指定主键生成策略的一方,需要设置constrained="true",以此表示外键约束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值