hibernate关联注解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

说明:

本文对hibernate的一对多、多对一、多对多的关联

示例代码是Order类和OrderItem类的一对多的关系

1.一对多

1.1注解方式:

@OneToMany 代码示例如下:

双向关联,维护端在“多”的一端

Public class Order implements Serializable {

Private Set orderItems = new HashSet();

@OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义@joincolumn),cascade = CascadeType.ALL, fetch = ZY)

@OrderBy(value= "id ASC")

public Set getOrderItems() {

return orderItems;

}

}

单向关联,维护端在此端

Public class Order implements Serializable {

private Set orderItems = new HashSet();

@OneToMany(cascade = CascadeType.ALL, fetch = ZY)

@JoinColumn(name=”order_id”)

@OrderBy(value= "id ASC")

public Set getOrderItems() {

return orderItems;

}

}

1.2维护端和级联问题

维护端的意思是对外键进行维护,维护端有对外键进行插入和更新的权利。

下面分情况介绍hibernate的级联操作:

1.2.1单向关联

对“一”表进行插入一条记录的操作:

1)级联类型:CascadeType.ALL

执行语句:

1.insert into category (description, name, id) values(?, ?, ?)

如果在关联表中没有该记录,执行

2.insert into product (descripton, name, price, id)

values (?, ?, ?, ?)

3.update product set category_id=? Where id=?

同时对外键值进行了写入。

2)关联类型:CascadeType.PERSIST/MERGE

执行语句:

1.Insert into category (description, name, id) values

(?, ?, ?)

如果关联表中数据有更新,执行:

2.update product set category_id=? Where id=?

如果关联表中没有记录,则会报错。

1.2.2双向关联(维护端在“多”端)

对“一”表进行插入一条记录的操作:

1)级联类型:CascadeType.ALL

执行语句:

1.insert into category (description, name, id) values(?, ?, ?)

如果关联表总没有该记录,执行

2.insert into product(category_id, descripton, name, price, id) values(?, ?, ?, ?, ?)

注意:关联表中的外键值为空,及外键由维护端进行维护。

2)关联类型:CascadeType.PERSIST/MERGE

执行语句:

insert into category (description, name, id) values (?, ?, ?)

2.多对一

2.1注解方式:

@ManyToOne(cascade=CascadeType.REFRESH,optional=false)

@JoinColumn(name = "order_id")

例如:

Public class OrderItem implements Serializable {

private Order order;

@ManyToOne (cascade=CascadeType.REFRESH,optional=false)

@JoinColumn(name = "order_id")

public Order getOrder() {

return order;

}

}

2.2维护端的级联问题

“多端”维护外键,及对外键有更新插入的权利。

在面是在多端执行插入记录所执行的SQL语句。

2.2.1单向关联

1)在“多”端插入一条记录,级联类型为CascadeType.ALL,执行的SQL语句为:

A.当关联方记录存在:

insert into product(category_id, descripton, name, price, id) values (?, ?, ?, ?, ?)

如果“一”端有更新则执行:

Update category set description=?,name=?

Where id=?

B.当关联方记录不存在:

insert into category (description, name, id)

values (?, ?, ?)

insert into product(category_id, descripton, name, price, id) values(?, ?, ?, ?, ?)

2)在“多”端插入一条记录,级联类型为CascadeType.PERSIST/MERGE/,执行SQL语句为:

A.一端记录存在:

insert into product(category_id, descripton, name, price, id) values (?, ?, ?, ?, ?)

如果有更新则执行:

Update category set description=?,name=? where id=?

注意:更新“一”端主键会报错

B.一端记录不存在:运行报错

2.2.2双向关联(多端为维护端)

1)在“多”端插入一条记录,级联类型为CascadeType.ALL/PERSIST/MERGE,执行SQL语句为:A关联端存在记录:

insert into product (category_id, descripton, name, price, id) values (?, ?, ?, ?, ?) 如果“一”端的数据有更新

Update category set description=?,name=? where id=?

注意:更改“一”端主键会报错

B关联端不存在记录:运行报错

相关文档
最新文档