文档库 最新最全的文档下载
当前位置:文档库 › hibernate双向一对多

hibernate双向一对多

Hibernate:
///
双向关联就是有“一对多”和“多对一”两个关联组合而成德,在双向关联的两端都知道对方是谁。

下面就开始演示这种关联。

首先定义我们需要使用的POJO对象。

public class Member
{
private String id;
private String name;
private Integer age;
private Set orders = new HashSet();//我知道Order对象
……
}

public class Order
{
private Integer id;
private String name;
private String num;
private Member member;//我知道Member对象
……
}

两个POJO对应的映射文件分别为Member.hbm.xml和Order.hbm.xml。

Member.hbm.xml
















Order.hbm.xml











下面我们来进行测试。

a、插入数据

public void insert()
{
Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
session.beginTransaction();
Member m = new Member();
m.setAge(24);
m.setName("Louis");

Order order = new Order();
order.setName("order 1");
order.setNum("order num 1");
order.setMember(m);
m.getOrders().add(order);

session.sa

ve(m);
session.getTransaction().commit();
}

查看Hibernate在后台使用的SQL语句如下:

Hibernate:
insert
into
TEST_MEMBER
(AGE, NAME, ID)
values
(?, ?, ?)
Hibernate:
insert
into
TEST_ORDER
(NAME, NUM, MEMBER_ID)
values
(?, ?, ?)

仅仅就两条语句,明显比单向关联的时候少了一条更新语句(把Order的外键进行更新为Menber的主键值)。

b、加载数据

和单向关联的区别在于,如果加载的是Order对象,那么它也知道和它关联的对象。


==================================
本文向大家介绍Hibernate实例一对多的情况,可能好多人还不了解Hibernate实例一对多,没有关系,下面通过一个实例来帮助您理解Hibernate实例一对多,希望本文能教会你更多东西。

先看由满江红翻译团队(RedSaga Translate Team)翻译的一对多配置说明,然后在看例子
一对多关联(One-to-many Associations)

一对多关联 通过外键 连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:

一个被包含的实体的实例只能被包含在一个集合的实例中

一个被包含的实体的实例只能对应于集合索引的一个值中

一个从Product到Part的关联需要关键字字段,可能还有一个索引字段指向Part所对应的表。 标记指明了一个一对多的关联。

class="ClassName" (1)
not-found="ignore|exception" (2)
entity-name="EntityName" (3)
node="element-name"
embed-xml="true|false"
/>

(1) class(必须):被关联类的名称。
(2) not-found (可选 - 默认为exception): 指明若缓存的标示值关联的行缺失,该如何处理: ignore 会把缺失的行作为一个空关联处理。
(3) entity-name (可选): 被关联的类的实体名,作为class的替代。
例子




set>

注意:元素不需要定义任何字段。 也不需要指定表名。

重要提示

如果Hibernate实例一对多关联中的外键字段定义成NOT NULL,你必须把映射声明为not-null="true",或者使用双向关联,并且标明inverse="true"。

1 先建表

create table student
(sid varchar ( 32 ) not null primary key ,
sname varchar ( 16 ),
sage varchar ( 16 ),
)
create table book
(bid varchar ( 32 ) not null primary key ,
bname varchar ( 16 ),
bprice varchar ( 16 ),
sid varchar (

32 )
)


2.写vo Student.java

package com.test;

import java.util.Set;

public class Student
{
private String sid;
private String sname;
private String sage;
private Set book;
public Student()
{
}
// 写上get set

Book.JAVA

package com.test;

public class Book
{
private String bid;
private String bname;
private String bprice;
public Book()
{
}
//写上get set

3.写对应的映射文件Student.hbm.xml

xml version="1.0"?>
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"https://www.wendangku.net/doc/435904704.html,/hibernate-mapping-2.0.dtd">








id>



property>



property>




set>

class>

hibernate-mapping>

Book.hbm.xml

xml version="1.0"?>
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"https://www.wendangku.net/doc/435904704.html,/hibernate-mapping-2.0.dtd">








id>



property>



property>

class>

hibernate-mapping>

c、删除数据

删除数据和单向关联时的删除数据的区别在于,对Member及它的关联对象Order加载后,不需要在更新Order的外键为NULL,而是紧跟着逐条删除Order,最后删除Member。

相关文档