Hibernate
一对多连接表单向关联
|
|
|
一、模型介绍
|
|
一个人(Person
)对应多个地址(Address
),比如家庭地址、公司地址。
|
|
二、实体(省略getter
、setter
方法)
|
|
public class Person1ntab {
|
private int personid;
|
private String name;
|
private int age;
|
private Set addresses=new HashSet();
|
|
public class Address1nfk implements Serializable {
|
private int addressid;
|
private String addressdetail;
|
|
三、表模型
|
|
mysql> desc join_1ntab;
|
+-----------+---------+------+-----+---------+-------+
|
| Field
| Type
| Null | Key | Default | Extra |
|
+-----------+---------+------+-----+---------+-------+
|
| personid
| int(11) | NO
| PRI |
|
|
|
| addressid | int(11) | NO
| PRI |
|
|
|
+-----------+---------+------+-----+---------+-------+
|
|
mysql> desc person_1ntab;
|
+----------+--------------+------+-----+---------+----------------+
|
| Field
| Type
| Null | Key | Default | Extra
|
|
+----------+--------------+------+-----+---------+----------------+
|
| personid | int(11)
| NO
| PRI | NULL
| auto_increment |
|
| name
| varchar(255) | YES
|
| NULL
|
|
|
| age
| int(11)
| YES
|
| NULL
|
|
|
+----------+--------------+------+-----+---------+----------------+
|
|
mysql> desc address_1ntab;
|
+---------------+--------------+------+-----+---------+----------------+
|
| Field
| Type
| Null | Key | Default | Extra
|
|
+---------------+--------------+------+-----+---------+----------------+
|
| addressid
| int(11)
| NO
| PRI | NULL
| auto_increment |
|
| addressdetail | varchar(255) | YES
|
| NULL
|
|
|
+---------------+--------------+------+-----+---------+----------------+
|
|
四、生成的SQL
脚本
|
|
/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */
|
CREATE TABLE `address_1ntab` (
|
`addressid` int(11) NOT NULL auto_increment,
|
`addressdetail` varchar(255) default NULL,
|
PRIMARY KEY
(`addressid`)
|
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;
|
|
/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */
|
CREATE TABLE `join_1ntab` (
|
`personid` int(11) NOT NULL,
|
`addressid` int(11) NOT NULL,
|
PRIMARY KEY
(`personid`,`addressid`),
|
UNIQUE KEY `addressid` (`addressid`),
|
KEY `FK6B6078C3C8DF5BFF` (`personid`),
|
KEY `FK6B6078C3C2B11347` (`addressid`),
|
CONSTRAINT `FK6B6078C3C2B11347` FOREIGN KEY (`addressid`) REFERENCES `address_1ntab` (`addressid`),
|
CONSTRAINT `FK6B6078C3C8DF5BFF` FOREIGN KEY (`personid`) REFERENCES `person_1ntab` (`personid`)
|
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
|
|
/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */
|
CREATE TABLE `person_1ntab` (
|
`personid` int(11) NOT NULL auto_increment,
|
`name` varchar(255) default NULL,
|
`age` int(11) default NULL,
|
PRIMARY KEY
(`personid`)
|
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
|
|
|
五、映射方法
|
|
<hibernate-mapping>
|
<class name="com.lavasoft.dx._1_n_tab.Person1ntab" table="PERSON_1ntab">
|
<id name="personid">
|
<generator class="identity"/>
|
</id>
|
<property name="name"/>
|
<property name="age"/>
|
<!--
映射集合属性,join_1ntab
是连接表表名-->
|
<set name="addresses"
|
table="join_1ntab"
|
>
|
<!--
“column="personid"
”确定PERSON_1ntab
表关联到连接表的外键列名-->
|
<key column="personid"/>
|
<!--
“column="addressid"
”关联PERSON_1ntab
表的Address1ntab
对象的id
在连接表中的列名-->
|
<!--
“unique="true"
表示1-N
,Person1ntab
是1
,Address1ntab
是多”-->
|
<many-to-many
|
column="addressid"
|
unique="true"
|
class="com.lavasoft.dx._1_n_tab.Address1ntab"/>
|
</set>
|
</class>
|
</hibernate-mapping>
|
|
<hibernate-mapping>
|
<class name="com.lavasoft.dx._1_n_tab.Address1ntab" table="ADDRESS_1ntab">
|
<id name="addressid">
|
<generator class="identity"/>
|
</id>
|
<property name="addressdetail"/>
|
</class>
|
</hibernate-mapping>
|
|
|
六、测试方法
|
|
public class Test_1ntab {
|
public static void main(String[] args){
|
Address1ntab add1=new Address1ntab();
|
Address1ntab add2=new Address1ntab();
|
Address1ntab add3=new Address1ntab();
|
Person1ntab p1=new Person1ntab();
|
Person1ntab p2=new Person1ntab();
|
|
add1.setAddressdetail("
郑州市经三路");
|
add2.setAddressdetail("
合肥市宿州路");
|
add3.setAddressdetail("
北京市长安路");
|
p1.setName("wang");
|
p1.setAge(30);
|
p2.setName("lee");
|
p2.setAge(50);
|
|
p1.getAddresses().add(add1);
|
p1.getAddresses().add(add2);
|
//p2.getAddresses().add(add2);
|
p2.getAddresses().add(add3);
|
|
Session session= HibernateUtil.getCurrentSession();
|
Transaction tx=session.beginTransaction();
|
session.save(add1);
|
session.save(add2);
|
|
相关推荐
5. Hibernate 一对多连接表单向关联: 类似于一对一的连接表关联,这里也是通过额外的连接表实现一对多关系。连接表会包含两个外键,一个指向父实体,另一个指向子实体。映射配置中,需要创建连接表实体,并使用 `...
这篇博客“Hibernate 多对一连接表单向关联”可能详细讲解了如何在Hibernate中配置和使用这种关联。 首先,我们要理解多对一关联的基本概念。假设我们有两个实体,例如`Employee`(员工)和`Department`(部门)。...
本文旨在深入探讨Hibernate中的实体关联关系映射技术,主要包括一对一、一对多、多对多等不同类型的关联关系及其在实际开发中的应用技巧。通过本文的学习,开发者可以更好地理解和掌握Hibernate框架下的实体关联关系...
在一对多连接表单向关联中,一个实体(父实体)与多个实体(子实体)相关联,这种关联通过第三个表(连接表或关联表)来实现。 **表结构示例**: - **Department表**: - `departmentid`: 主键 - `departmentName`...
#### 一、Hibernate一对一连接表单向关联 一对一连接表单向关联是指在数据库中通过一张连接表来实现两个表之间的关联,并且这种关联是单向的,即在一个实体中定义了另一个实体的关系,而另一个实体并不知道这种关系...
在问题描述中,我们遇到的是一个关于Hibernate一对多自身关联的问题,特别是在Struts框架中使用FormBean时出现的异常行为。 首先,让我们来理解一下问题的核心部分。在Struts中,FormBean默认的Scope是Session,这...
在Hibernate中,我们可以通过在实体类中定义集合属性(如List或Set)来表示这种关系,同时在对应的.hbm.xml映射文件中配置一对多的关联。 2. **数据库设计**:MySQL数据库中会有两个表,一个是`student`,包含学生...
#### 2.1.5 一对多连接表单向关联 与一对一类似,但涉及多方,`<join>`标签用于连接表。 #### 2.1.6 多对一外键单向关联 多个实体可以关联到一个实体,如多个个人对应一个地址。这使用`<many-to-one>`标签。 ```...
这包括一对一、一对多、多对一和多对多四种关联类型。例如,一个用户可以有多个订单,这是一种一对多的关系;反之,每个订单对应一个用户,这是一种多对一的关系。实现数据关联通常通过配置XML映射文件或使用注解来...
1. 避免使用单向一对多关联,改为双向一对多。 2. 合理使用单向一对多关联。 3. 避免一对一关系,用多对一代替。 4. 配置对象缓存,避免使用集合缓存。 5. 一对多集合使用Bag,多对多集合使用Set。 6. 继承类使用...
Hibernate通过配置文件支持一对一、一对多、多对一和多对多的关系映射。 **缓存机制**: - **一级缓存**:内部缓存,每个Session有自己的缓存,生命周期与Session相同。 - **二级缓存**:可选的全局缓存,支持应用...
1. **双向一对多关联**:减少数据冗余,提高数据一致性。 2. **灵活使用单向一对多**:避免循环引用,提高性能。 3. **避免不必要的一对一关联**:多对一通常更为高效。 4. **对象缓存策略**:避免使用集合缓存,...
总之,这个实例是一个很好的学习平台,它不仅展示了基本的CRUD操作,还涵盖了更高级的多对一查询和部分删除功能,这对于初学者理解Struts和Hibernate的整合使用非常有帮助。通过实际操作这个实例,开发者能够加深对...
2. 灵活使用单向一对多关联 3. 不用一对一,用多对一取代 4. 配置对象缓存,不使用集合缓存 5. 一对多集合使用Bag,多对多集合使用Set 6. 继承类使用显式多态 7. 表字段要少,表关联不要怕多,有二级缓存撑腰 ...
Hibernate通过配置文件(如.hbm.xml)中的`many-to-one`、`one-to-many`、`many-to-many`等标签,实现一对一、一对多、多对多等关系。 4. **Hibernate缓存机制**: - 一级缓存:默认存在于Hibernate Session中,...
对于Hibernate的优化,可以采取以下策略:避免单向一对多关联,利用双向一对多;灵活运用单向一对多;避免一对一关系,改用多对一;配置对象缓存而非集合缓存;使用Bag表示一对多集合,Set表示多对多集合;使用显式...
- 灵活使用单向一对多,减少不必要的关联。 - 用多对一替换一对一,减少数据库表的冗余。 - 配置对象缓存,避免集合缓存带来的性能问题。 - 使用Bag(无序集合)处理一对多,Set(唯一元素集合)处理多对多。 - 显式...
本资料主要围绕“Hibernate Form到Model转换器在处理一对多关系映射”这一主题进行深入探讨,通过实例解析如何实现从表单数据到模型对象的高效转换,并处理一对多关联关系。 首先,让我们理解什么是Form到Model转换...
Hibernate支持多种关系映射,如一对一、一对多、多对多等。这些关系可以通过配置文件中的many-to-one、one-to-many、many-to-many等元素来定义,实现对象之间的关联。 4. **Hibernate 缓存机制**: Hibernate有一...