@manytomany
关系维护端
@Entity
public class Test1 {
public String id;
public String name;
public Set<Test2> test2;
@Id
@GenericGenerator(name = "idGenerator", strategy = "org.hibernate.id.UUIDGenerator")
@GeneratedValue(generator = "idGenerator")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Column
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(targetEntity=com.peyey.coo.model.Test2.class,
cascade = {javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.MERGE}
)
@JoinTable(name="test1test2",joinColumns=@JoinColumn(name="test1_id",referencedColumnName="id"),
inverseJoinColumns={@JoinColumn(name="test2_id",referencedColumnName="id")})
public Set<Test2> getTest2() {
return test2;
}
public void setTest2(Set<Test2> test2) {
this.test2 = test2;
}
}
关系被维护端:
@Entity
public class Test2 {
public String id;
public String name;
public Set<Test1> test1;
@Id
@GenericGenerator(name = "idGenerator", strategy = "org.hibernate.id.UUIDGenerator")
@GeneratedValue(generator = "idGenerator")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Column
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToMany(
cascade = {javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.MERGE},
targetEntity=com.peyey.coo.model.Test1.class,
mappedBy="test2"
)
public Set<Test1> getTest1() {
return test1;
}
public void setTest1(Set<Test1> test1) {
this.test1 = test1;
}
}
增删改操作:
public void create(){
/*
* Test1维护关系
* 通过Test1级联增加Test2
*
*
*/
Test1 test1a=new Test1();
Test2 test2a=new Test2();
test2a.setName("test2a");
Test2 test2b=new Test2();
test2b.setName("test2b");
/**
* Test2的记录需要各自添加
* 所谓的级联增加,只是Test1对中间表而言
*/
test2Dao.save(test2a);
test2Dao.save(test2b);
Set<Test2> test2=new HashSet<Test2>();
test2.add(test2a);
test2.add(test2b);
test1a.setName("aaaa");
test1a.setTest2(test2);
test1Dao.save(test1a);
}
@Override
public void update() {
/**
* 删除中间表的记录
* 需要从Test1表出发,remove掉关联记录,然后更新
*/
Test1 test1=test1Dao.get("253ca3bc-6dc9-48a5-9948-067a40394497");
test1.getTest2().remove(test2Dao.get("c99c5a0d-6574-499a-ba59-e677afc1b8bf"));
test1Dao.update(test1);
}
@Override
public void delete() {
/**
* 删除维护关系的Test1,如果在关联表中有相关的记录,也会删除
*/
test1Dao.delete(test1Dao.get("253ca3bc-6dc9-48a5-9948-067a40394497"));
/**
* 如果需要删除Test2中的a记录,需要先找出Test2中a记录关联的Test1的记录列表,
* 然后通过Test1的那些记录逐个remove掉关联表中关于a的记录,然后更新Test1
* 最后再在Test2中删除a记录
*/
//test2Dao.delete(test2Dao.get("c99c5a0d-6574-499a-ba59-e677afc1b8bf"));
}
对于被维护端删除操作烦琐的问题需要解决。两端均维护关系?
比较习惯将manytomany拆分成两个manytoone。
分享到:
相关推荐
在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,允许一个实体实例对应多个其他实体实例,反之亦然。本例子将深入探讨如何在Hibernate中设置并管理多对多关系。 首先,我们...
本文将详细讨论在Hibernate 5中如何实现ManyToMany单向维护的多对多关联。 首先,我们要理解多对多关联的基本概念。在数据库设计中,多对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联,反之亦然。...
问题:如何跨多对多关系的两个实体投影列示例:员工(id、名字、姓氏)会议(id、主题、会议日期) 假设我们有员工数据 1 , A, AA 2 , B, BB 会议 1,AB 会议,X 2,另一个会议,X 3,仅 B Employee_Meeting AB A 和...
本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...
本文将深入探讨如何在Hibernate中实现多对多(ManyToMany)的关系映射,以及相关的重要概念和技术细节。 在数据库设计中,多对多关系是最常见的一种关联类型,例如,一个学生可以选修多门课程,一门课程也可以被多...
在Hibernate中,我们可以通过`@ManyToMany`注解来定义这种关系,并使用`@JoinTable`注解来指定中间表的信息。例如: ```java @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType....
在Java的持久化框架Hibernate中,`@ManyToMany`注解是用于处理数据库中的多对多(Many-to-Many)关系。多对多关系是指一个实体可以与多个其他实体相关联,反之亦然。这种关系在数据库表设计中通常通过中间表来实现,...
在Java持久化框架Hibernate中,ManyToMany关系是一种重要的关联类型,它表示两个实体类之间可能存在多个实例互相关联的情况。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选修,这就是典型的...
7. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)关系的映射,方便处理对象间的关联关系。 8. **延迟加载**:Hibernate的懒加载策略可以在需要时才...
2. 关联注解:`@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany` 这些注解分别表示一对多、多对一、一对一和多对多的关系。例如,表示用户与角色的一对多关系: ```java @ManyToOne @JoinColumn(name=...
- **多对多(ManyToMany)**: 多行记录对应数据库表的多个实体类实例。 **6. 缓存机制** - **一级缓存**: Session内的缓存,自动管理,无需额外配置。 - **二级缓存**: 应用级别的缓存,可选,可以通过插件如...
7. 关联映射:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)四种关系映射,以及级联操作(cascade)和懒加载(lazy)策略。 8. 自动更新和插入:Hibernate的自动...
7. **关联映射**: Hibernate支持多种关联映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。理解这些关联类型以及它们的配置是掌握Hibernate的重要环节。 8. **...
`hibernate_manytomany_1.jpg`和`hibernate_manytomany_2.jpg`可能包含了多对多关联的配置或操作示意图,而`Hibernate_manytomanyTest.rar`和`accpDB.rar`则可能是相关的源代码或数据库文件,供学习者下载并运行测试...
10. **一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany)关系映射**:Hibernate提供了多种关联映射方式,帮助处理复杂的数据关系。 11. **继承映射**:Hibernate支持单表继承、联合继承和表-per-...
Hibernate 支持多种数据库表之间的关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过 `<one-to-one>`、`<list>`、`<set>` 等元素可以定义这些关系,并指定...
例如,`@Entity`表示一个Java类对应数据库中的一个表,`@Table`定义表名,`@Id`标记主键,`@GeneratedValue`管理主键生成策略,`@ManyToOne`, `@OneToMany`, `@OneToOne`和`@ManyToMany`用于建立对象间的关联关系。...
《Hibernate手册中文版》是Java开发领域中关于Hibernate框架的重要参考资料,它详尽地阐述了如何使用Hibernate进行对象关系映射(ORM)以及数据库交互。Hibernate作为一种强大的开源ORM框架,极大地简化了Java应用与...
3. **Entity实体**:了解@Entity、@Table、@Id等注解的用法,以及如何定义实体关系,如@ManyToOne、@OneToMany、@OneToOne和@ManyToMany。 4. **持久化操作**:学习使用Session的save()、saveOrUpdate()、update()、...
7. **级联操作**:通过 `@OneToMany`, `@ManyToOne`, `@ManyToMany` 等注解,可以配置实体之间的关联,并设置级联操作,如级联保存、删除等。 8. **缓存**:Hibernate 支持一级缓存(Session 缓存)和二级缓存,...