多对多连接表双向关联时:只能有一端的<set>放入属性inverse="true",之后Session.save()时,首先保存哪个端POJO均可,当另一端的POJO必须调用saveOrUpdate()进行相应的链接和连接表的更新。
示例:
一个Person可以有多个Address,一个Address可以有多个Person。利用连接表进行双向链接:
数据库表:
CREATE TABLE `address_nn_sx` (
`addressid` int(11) NOT NULL auto_increment,
`addressdetail` varchar(255) default NULL,
PRIMARY KEY (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE `person_nn_sx` (
`personid` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`age` int(11) default NULL,
PRIMARY KEY (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
CREATE TABLE `join_nn_sx` (
`addressid` int(11) NOT NULL,
`personid` int(11) NOT NULL,
PRIMARY KEY (`personid`,`addressid`),
KEY `FK6EBBC5EF6C600921` (`personid`),
KEY `FK6EBBC5EF2A92FF3D` (`addressid`),
CONSTRAINT `FK6EBBC5EF2A92FF3D` FOREIGN KEY (`addressid`) REFERENCES `address_nn_sx` (`addressid`),
CONSTRAINT `FK6EBBC5EF6C600921` FOREIGN KEY (`personid`) REFERENCES `person_nn_sx` (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
POJO(省去getter,setter):
public class Personnn_sx {
private int personid;
private String name;
private int age;
private Set addresses=new HashSet();
public class Addressnn_sx {
private int addressid;
private String addressdetail;
private Set persons = new HashSet();
hbm.xml:
<hibernate-mapping>
<class name="com.Addressnnsx" table="address_nn_sx">
<id column="addressid" name="addressid" type="int">
<generator class="identity"/>
</id>
<property name="addressdetail" column="addressdetail" type="string"/>
<set name="persons" table="join_nn_sx">
<key column="addressid"/>
<many-to-many column="personid" class="com.Personnnsx"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.Personnnsx" table="person_nn_sx">
<id column="personid" name="personid" type="int">
<generator class="identity"/>
</id>
<property name="name" column="name" type="string"/>
<property name="age" column="age" type="int"/>
<set table="join_nn_sx"
name="addresses" cascade="all" inverse="true">
<key column="personid"/>
<many-to-many class="com.Addressnnsx"
column="addressid"/>
</set>
</class>
</hibernate-mapping>
Test Main:
public class Test_nn_sx {
public static void main(String args[]){
Addressnnsx add1=new Addressnnsx();
Addressnnsx add2=new Addressnnsx();
Personnnsx p1=new Personnnsx();
Personnnsx p2=new Personnnsx();
add1.setAddressdetail("郑州市经三路");
add2.setAddressdetail("合肥市宿州路");
p1.setName("wang");
p1.setAge(30);
p2.setName("zhang");
p2.setAge(22);
add1.getPersons().add(p1);
add2.getPersons().add(p1);
add2.getPersons().add(p2);
p1.getAddresses().add(add1);
p1.getAddresses().add(add2);
p2.getAddresses().add(add2);
Session session= HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(add1);
session.save(add2);
session.saveOrUpdate(p1);
session.saveOrUpdate(p2);
//session.save(p1);
//session.save(p2);
//session.saveOrUpdate(add1); //上面的save()已经对相应的address进行插入操作,故这里必须检查相应的表是否需要更新再保存
//session.saveOrUpdate(add2);
tx.commit();
HibernateUtil.closeSession();
}
}
分享到:
相关推荐
在Hibernate中,实现多对多双向关联主要涉及以下步骤: 1. **配置实体类**:首先,你需要为每个参与关联的实体定义一个Java类,并添加相应的属性。例如,对于“学生-课程”关系,可以有`Student`和`Course`类,它们...
“Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...
在实际项目中,多对多双向关联可能会引发性能问题,因为每次查询可能涉及更多的表连接。为了优化,可以考虑使用单向关联,或者使用中间实体(带有额外属性的关联表)来减少JOIN操作。 此外,当处理大量数据时,批量...
**标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...
总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...
本篇将详细讲解JPA中的一个关键概念——多对多双向关联,并通过实体定义与注解设置来深入理解这一特性。"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与...
总之,MyBatis的一对多双向关联提供了丰富的数据模型映射能力,使得在Java对象和数据库表之间建立复杂关系变得更加容易。通过合理配置映射文件和Java实体,以及充分利用MyBatis提供的工具,可以高效地管理这些关联...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...
本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...
9. Hibernate 一对一外键双向关联、主键双向关联、连接表双向关联、一对多外键双向关联、一对多连接表双向关联、多对多双向关联: 这些关联方式与单向关联类似,区别在于两个实体类都知道彼此的关联。在双向关联中...
3. **双向关联**:如果两个实体类之间是双向关联,需要在一方使用`mappedBy`属性,指明关联的属性。如上所示,Role类中的`users`属性就是User类中`roles`属性的引用。 4. **持久化操作**:在业务逻辑中,可以通过...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为...在实际开发中,应根据业务需求来决定是否使用双向关联,以及如何维护这种关系,以避免可能出现的数据不一致问题。
在Hibernate中,多对多关联可以通过定义双向或单向的关联来实现。"单项关联"通常指的是只在一个实体类中定义了与另一个实体的关联,而在另一个实体类中没有对应的引用。这可以通过使用`@ManyToMany`注解来完成。 ...
在Hibernate中,我们可以创建一个中间实体类来表示这个中间表,同时在两个主实体类上设置双向关联。 中间实体关联关系的配置主要包括以下几个步骤: 1. **定义中间实体类**:创建一个新的Java类,代表中间表,通常...
这样,JPA会自动处理中间表的插入,实现双向多对多的关联。 在查询时,我们可以通过一个实体直接获取另一个实体的关联集合。例如,如果我们想知道`Course`实例`course1`对应的学生,只需调用`course1.getStudents()...
- 连接表双向关联 2. **一对多关联**(One-to-Many / Many-to-One) - 外键单向关联 - 连接表单向关联 - 外键双向关联 - 连接表双向关联 3. **多对多关联**(Many-to-Many) - 单向关联 - 双向关联 每种...
在本篇【myeclipse试用小记----Hibernate多对一双向关联(2)】中,博主主要探讨了使用MyEclipse集成开发环境与Hibernate框架进行多对一双向关联的配置与实现。MyEclipse是Eclipse的一个强大扩展,特别适合Java Web...
在实际的项目开发中,我们经常遇到各种各样的关联关系,比如一对一、一对多、多对一、多对多等。本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared ...