- 浏览: 394738 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 数据中台 (15)
- 设计模式 (7)
- 数据结构 (4)
- JavaScript (51)
- 网页设计与制作 (7)
- Flex (4)
- Fckeditor (7)
- Struts (12)
- Spring (19)
- Hibernate (14)
- EJB3.0 (19)
- Java EE 6 (2)
- JSP (22)
- 辅助框架 (9)
- WebService (1)
- XML (8)
- 正则表达式 (5)
- 并发(多线程) (2)
- Java网络 (10)
- 开发工具 (25)
- Oracle (15)
- MySQL (8)
- Git (4)
- SQL Server (2)
- C# (9)
- php (14)
- asp (2)
- ColdFusion (5)
- Tex (1)
- 云游戏 (1)
最新评论
-
CSDNBenbenChong:
...
SQL里desc和asc是什么意思 -
雪狐一号:
非常好 顶一个
SQL里desc和asc是什么意思 -
boyleichinasoft:
thinking...
该如何去使用设计模式呢? -
nforce_com:
写的很好,学习了!不过Student 一般情况下不会删除所有 ...
JPA多对多 -
TaoistWar:
那是FCKEditor的,详细信息只能查看官方文档,或者直接看 ...
1.fckeditor-java-2.5给上传图片添加水印
维护端注解
@ManyToMany (cascade = CascadeType.REFRESH)
@JoinTable (//关联表
name = "student_teacher" , //关联表名
inverseJoinColumns = @JoinColumn (name = "teacher_id" ),//被维护端外键
joinColumns = @JoinColumn (name = "student_id" ))//维护端外键
被维护端注解
@ManyToMany(
cascade = CascadeType.REFRESH,
mappedBy = "teachers",//通过维护端的属性关联
fetch = FetchType.LAZY)
关系维护端删除时,如果中间表存在些纪录的关联信息,则会删除该关联信息;
关系被维护端删除时,如果中间表存在些纪录的关联信息,则会删除失败 .
以学生和老师的对应关系为例。一个学生可以拥有多个老师,一个老师也可以拥有多个学生。
学生实体类
package com.taoistwar.jpa.entity.manytomany; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Student { private Integer id; private String name; private Set<Teacher> teachers = new HashSet<Teacher>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(nullable = false, length = 16) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade = CascadeType.REFRESH) @JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) public Set<Teacher> getTeachers() { return teachers; } public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } public void addTeacher(Teacher teacher) { this.teachers.add(teacher); } public void removeTeachers(Teacher teacher) { this.teachers.remove(teacher); } }
重点在于:
@ManyToMany(cascade = CascadeType.REFRESH) @JoinTable(name = "student_teacher", inverseJoinColumns = @JoinColumn(name = "teacher_id"), joinColumns = @JoinColumn(name = "student_id")) public Set<Teacher> getTeachers() { return teachers; }
老师实体类
package com.taoistwar.jpa.entity.manytomany; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Teacher { private Integer id; private String name; private Set<Student> students = new HashSet<Student>(); @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(nullable = false, length = 16) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Teacher other = (Teacher) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
重点在于:
@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers", fetch = FetchType.LAZY) public Set<Student> getStudents() { return students; }
拥有mappedBy注解的实体类为关系被维护端,另外的实体类为关系维护端的。顾名思意,关系的维护端对关系(在多对多为中间关联表)的CRUD做操作。关系的被维护端没有该操作,不能维护关系。
测试类
package com.taoistwar.jpa.entity.manytomany; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.Test; public class ManyToMany { @Test public void save() { EntityManagerFactory emf = Persistence .createEntityManagerFactory("JPAPU"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Student student = new Student(); student.setName("小李"); Teacher teacher = new Teacher(); teacher.setName("大李"); em.persist(student); em.persist(teacher); em.getTransaction().commit(); emf.close(); } @Test public void bind() { EntityManagerFactory emf = Persistence .createEntityManagerFactory("JPAPU"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Student student = em.find(Student.class, 1); Teacher teacher = em.find(Teacher.class, 1); student.addTeacher(teacher); em.persist(student); em.getTransaction().commit(); emf.close(); } @Test public void unbind() { EntityManagerFactory emf = Persistence .createEntityManagerFactory("JPAPU"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); Student student = em.find(Student.class, 1); Teacher teacher = em.find(Teacher.class, 1); student.removeTeachers(teacher); em.persist(student); em.getTransaction().commit(); emf.close(); } @Test public void removeTeacher() { EntityManagerFactory emf = Persistence .createEntityManagerFactory("JPAPU"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); // 关系被维护端删除时,如果中间表存在些纪录的关联信息,则会删除失败 em.remove(em.getReference(Teacher.class, 1)); em.getTransaction().commit(); emf.close(); } @Test public void removeStudent() { EntityManagerFactory emf = Persistence .createEntityManagerFactory("JPAPU"); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); // 关系维护端删除时,如果中间表存在些纪录的关联信息,则会删除该关联信息 em.remove(em.getReference(Student.class, 1)); em.getTransaction().commit(); emf.close(); } }
- JPA.zip (5.7 MB)
- 下载次数: 182
评论
1 楼
nforce_com
2011-05-12
写的很好,学习了!不过Student 一般情况下不会删除所有的Teacher ,仅会删除某个Teacher ,这里面没太讲清楚,下面加上部分代码:
.........举例,因环境不同略去.......
public void doDeleteDetail(ActionEvent event) {
.........举例,因环境不同略去.......
Set<Teacher > set = getInstance().getTeacher();
Iterator<Teacher > itr = set.iterator();
while (itr.hasNext()) {
Teacher m = itr.next();
if (item.getId().equals(m.getId())) {
log.info("---RequestMap:#0", m.getId());
set.remove(m);
// 实体的改变同步到数据库
getEntityManager().merge(getInstance());
// 会话没有结束,手动flush
getEntityManager().flush();
return;
}
}
}
.........举例,因环境不同略去.......
public void doDeleteDetail(ActionEvent event) {
.........举例,因环境不同略去.......
Set<Teacher > set = getInstance().getTeacher();
Iterator<Teacher > itr = set.iterator();
while (itr.hasNext()) {
Teacher m = itr.next();
if (item.getId().equals(m.getId())) {
log.info("---RequestMap:#0", m.getId());
set.remove(m);
// 实体的改变同步到数据库
getEntityManager().merge(getInstance());
// 会话没有结束,手动flush
getEntityManager().flush();
return;
}
}
}
发表评论
-
8.EJB3的拦截器(外部类)
2010-05-11 11:00 1049EJB3的拦截器的开步骤: 1.开发拦截器 使用@A ... -
Caused by: org.hibernate.HibernateException: unknown Oracle major version [0]
2010-02-24 09:34 1757昨天试了一下把mysql的数据源配置mysql-ds.xml放 ... -
detached entity passed to persist
2010-02-02 08:01 1694detached entity passed to persi ... -
实体的状态
2009-06-17 23:04 579新建状态:新建的实体对象,尚未拥有持久化主键,没有和一个持久化 ... -
EJB3的一些常见注解
2009-06-17 22:58 8990.实体管理器 @Persisten ... -
JPA双向一对多和多对一
2009-06-16 01:03 4666JPA中一对多和多对一双向关系中,多的一方为关系维护端 ... -
JPA一对多和多对一关系
2009-05-16 11:18 59991-m:多的一方为关系维护端,关系维护端负责外键纪录 ... -
JPA(HIberante)环境的搭建
2009-04-19 14:18 18581.添加jar包 hibernate & jpa j ... -
6.2 配置JBoss数据源(Oracle10G)
2009-03-17 10:38 15821.配置数据源 <?xml version=" ... -
6.1 配置JBoss数据源(MS SQL Server2005)
2009-03-17 09:35 17181.SQL Server 2005 配置内容: <?xm ... -
8.开发消息驱动Bean
2009-03-13 22:59 10141.配置消息服务 <?xml version=&qu ... -
7.单表实体Bean
2009-03-09 23:47 997(1):建表SQL语句(MySQL) ... -
6.配置JBoss数据源
2009-03-09 18:57 2357以MySQL为例: (1):添 ... -
5.开发有状态Bean
2009-03-05 23:37 8061.无状态Bean使用实例池技术管理Bean.性能 ... -
4.开发本地接口的无状态会话Bean
2009-03-05 23:03 779远程接口需要 ... -
3.通过ANT来提高应用的开发效率
2009-03-05 22:21 596<?xml version="1.0" ... -
2.开发EJB的客户端
2009-03-05 20:49 879EJB是业务层,通常被客户端调用,客户端可以是J ... -
1.EJB的HelloWorld!
2009-03-05 20:32 1700用Eclipse开发EJB需要用到EJB的类库 ...
相关推荐
一个老师和学生多对多的例子,更有增删改查的方法
JPA一对一,一对多,多对多关系映射,面向对象领域
13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置.rar
NULL 博文链接:https://1028826685.iteye.com/blog/1525772
刚学完了hibernate和ejb,自己又自学了下jpa,看了黎活明老师的视频,自己做了个多对多的例子,希望可以对你学习有所帮助,有心人可以联系我QQ770256061!
14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作.rar
JPA中实现双向多对多的关联关系示例代码;
使用学生(student)、老师(teacher)、班级(class)反映出Hibernate annotation JPA 的一对多、多对多、多对一的关联。或许对您有用
09_JPA详解_使用JPQL语句进行查询.zip 09_JPA详解_使用JPQL语句进行查询.zip
Spring Boot+Jpa多数据源配置Demo,可同时支持多种数据库,不同数据库,同时支持不同数据库的JdbcTemplate
jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一jpa--9.单向多对一
JPA简单培置,JPA多对一,JPA一对一,JPA多对多,JPA联合主键几个小列子。
11_JPA详解_JPA中的一对多延迟加载与关系维护.zip 11_JPA详解_JPA中的一对多延迟加载与关系维护.zip
springboot+JPA 多数据源配置springboot+JPA 多数据源配置
11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护.rar
JPA中双向一对多实体Bean的属性配置,包括延迟加载,级联删除等
JPA教程JPA教程JPA教程JPA教程JPA教程
使用springboot + JPA / MyBatis 实现多数据源动态切换
jpa jpa规范 jpa源码 jpa jpa规范 jpa源码
springboot结合jpa实现分页,动态多条件查询,使用thymeleaf前端渲染数据