Hibernate:
///
双向关联就是有“一对多”和“多对一”两个关联组合而成德,在双向关联的两端都知道对方是谁。
下面就开始演示这种关联。
首先定义我们需要使用的POJO对象。
public class Member
{
private String id;
private String name;
private Integer age;
private Set
……
}
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所对应的表。 标记指明了一个一对多的关联。
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。