- 浏览: 228122 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
redlwb225:
刚好用到,总体可用,但是转int和short的方法有些问题,会 ...
java :获取wav文件的编码格式,音频的通道数,采样频率,采样位数 -
一个人de我们:
[/b][b][i][/i][u][/u]引用
[img][ ...
java通过文件头内容判断文件类型 -
gpinglee:
排版太乱了吧,看起来很吃力。
关于 JDBC 资源回收的讨论 ! -
emeraldttt:
写的非常好 很多东西总结的浅显易懂
01、全面阐释和精彩总结JPA -
咸蛋超人:
请问下,安装后,是如何使用的
常用Eclipse插件
目录结构,看图:
Student.java
package cn.itcast.bean; 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.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>(); public Student() { } public Student(String name) { this.name = name; } @Id @GeneratedValue // id作为实体标识符,并且采用数据库的id自增长方式生成主键值。 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length = 10, nullable = false) 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; } /* 假如不对关联表里的字段做任何设定,那么表里面的字段默认由JPA的实现产品来帮我们自动生成。 inverseJoinColumns:inverse中文是反转的意思,但是觉得太恶心了,在JPA里,可以理解为被维护端。 inverseJoinColumns:被维护端外键的定义。 @JoinColumn:外键名称(中间表跟teacher表的主键关联的那个外键名称)。 joinColumns:关系维护端的定义。 */ public void setTeachers(Set<Teacher> teachers) { this.teachers = teachers; } public void addTeacher(Teacher teacher) { this.teachers.add(teacher); } public void removeTeacher(Teacher teacher) { if(this.teachers.contains(teacher)){ //凭什么判断teacher在集合teachers中呢?是根据teacher的id。这就要求必要重写Teacher.java的hasCode和equals方法,通过这两个方法来判断对象是否相等。 this.teachers.remove(teacher); } } }
Teacher.java
package cn.itcast.bean; 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.Id; import javax.persistence.ManyToMany; @Entity public class Teacher { private Integer id; private String name; private Set<Student> students = new HashSet<Student>(); public Teacher() { } public Teacher(String name) { this.name = name; } @Id @GeneratedValue // id作为实体标识符,并且采用数据库的id自增长方式生成主键值。 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(length = 10, nullable = false) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "teachers") public Set<Student> getStudents() { return students; } /* cascade: CascadeType.PERSIST:级联保存不要,学生没来之前,老师就已经在了。 CascadeType.MERGE:级联更新不要,把学生的信息改了,没必要修改相应的老师的信息,压根就没这业务需求。 CascadeType.REMOVE:级联删除更不要,如果双方都设了级联删除,加入删除学生,会删除相应的老师,被删除的老师又跟学生发生千丝万缕的关系,又把一批学生删掉.....没完没了...最终的结果可能是数据里面所有的记录都被清掉。 所以在多对多关系中,级联删除通常是用不上的 这里只需设置级联涮新CascadeType.PERSIST就可以了,事实上refresh方法也很少使用。 mappedBy: 通过这个属性来说明老师是关系被维护端 fetch: 加载行为默认是延迟加载(懒加载),凭Many。 这里不需要设置。 */ 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()); //判断的依据是,如果id不为null的话,就返回id的哈希码。 return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Teacher other = (Teacher) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
ManyToManyTest.java
package junit.test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.BeforeClass; import org.junit.Test; import cn.itcast.bean.Student; import cn.itcast.bean.Teacher; public class ManyToManyTest { @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void save() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); em.persist(new Student("小张同学")); em.persist(new Teacher("李勇老师")); em.getTransaction().commit(); em.close(); factory.close(); } /* * 建立学生跟老师的关系 */ @Test public void buildTS() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Student student = em.find(Student.class, 1); // 首先要得到学生,因为学生是关系维护端,通过关系维护端来建立关系。 student.addTeacher(em.getReference(Teacher.class, 1)); //这方法在业务意义上,就代表建立跟老师的关系。 //所谓建立跟老师的关系,无非就是把老师加进集合里面去。 //建立关系,体现在JDBC上面,就是添加一条记录进中间表。 em.getTransaction().commit(); em.close(); factory.close(); } /* * 解除学生跟老师的关系 */ @Test public void deleteTS() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Student student = em.find(Student.class, 1); // 首先要得到学生,因为学生是关系维护端,通过关系维护端来建立关系。 student.removeTeacher(em.getReference(Teacher.class, 1)); //这方法在业务意义上,就代表解除跟老师的关系。 //所谓解除跟老师的关系,无非就是把老师从集合里面删去。 //解除关系,体现在JDBC上面,就是在中间表删除一条记录。 em.getTransaction().commit(); em.close(); factory.close(); } /* * 删除老师,老师已经跟学生建立起了关系(错误写法) */ @Test public void deleteTeacher1() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); em.remove(em.getReference(Teacher.class, 1)); //并不需要发生数据装载行为,只需要一个托管状态的实体,所以用getReference可以提供性能。 em.getTransaction().commit(); em.close(); factory.close(); } /* 该方法会出错,因为中间表中已经有记录了,会抛出以下错误: Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`itcast/student_teacher`, CONSTRAINT `FKD4E389DE1D49449D` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)) 关系被维护端没有权力更新外键,所以不会删除中间表的记录。 */ /* * 删除老师,老师已经跟学生建立起了关系(正确写法) */ @Test public void deleteTeacher2() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Student student = em.find(Student.class, 1); Teacher teacher = em.getReference(Teacher.class, 1); //并不需要发生数据装载行为,只需要一个托管状态的实体,所以用getReference可以提供性能。 student.removeTeacher(teacher); //student是关系维护端,有权利删除外键,只要在对象中删除了teacher,那么中间表中相关外键记录也就被删除了。 //想要删除teacher记录,必须先通过student解除关系才行。 em.remove(teacher); em.getTransaction().commit(); em.close(); factory.close(); } /* * 删除学生,老师已经跟学生建立起了关系 */ @Test public void deleteStudent() { EntityManagerFactory factory = Persistence .createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Student student = em.getReference(Student.class, 1); em.remove(student); //这样是可以删除学生的,尽管目前是有关系,中间表有关联记录,有外键约束。但是我们现在要删除的是关系维护端,关系维护端是有权力对外键进行增删改查操作的。删除的时候,Hibernate会判断student是关系维护端,然后去中间表把关联记录先删除掉。再删掉student对象。 em.getTransaction().commit(); em.close(); factory.close(); } }
发表评论
-
15、JPA中的联合主键
2010-07-13 17:16 2669两个或多个字段组成的主键,我们叫联合主键。在面向对 ... -
13、JPA中的多对多双向关联实体定义与注解设置
2010-07-13 17:04 1627Student.java package cn.itcas ... -
12、JPA中的一对一双向关联
2010-07-13 17:01 1952IDCard.java package cn.itcast ... -
11、JPA中的一对多延迟加载与关系维护(一对多关系:二)
2010-07-13 16:24 2743order.java package cn.itcast. ... -
10、JPA中的一对多双向关联与级联操作(一对多关系:一)
2010-07-13 16:21 3498Order.java package cn.itcast. ... -
09、使用JPQL语句进行查询
2010-07-13 16:18 2290查询语言(JPQL) 这是持久化操作中很重要的 ... -
08、分析JPA与持久化实现产品对接的源代码
2010-07-13 16:17 1898EntityManagerFactory factor ... -
07、使用JPA加载_更新_删除对象
2010-07-13 16:14 4039PersonTest.java package ju ... -
06、大数据字段映射与字段延迟加载
2010-07-13 16:06 1402Person.java package cn.itcast ... -
05、日期_枚举等字段类型的JPA映射
2010-07-13 16:01 2174映射元数据是什 ... -
04、第一个JPA实例与JPA主键生成策略
2010-07-13 15:58 6984写实体bean,映射的数据可以采用XML配置方式,也 ... -
03、搭建JPA开发环境和全局事务介绍
2010-07-09 09:57 1770persistence.xml(JPA规范要求 ... -
02、JPA开发环境和思想介绍
2010-07-09 09:49 1758开发JPA依赖的jar文件 注意jar文件不能放在含有 ... -
01、全面阐释和精彩总结JPA
2010-07-09 09:34 1663什么是JPA ---------------- ...
相关推荐
本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...
在本教程中,我们将深入探讨JPA中的多对多双向关联及其各项操作。 ### 1. 多对多关联基础 在关系型数据库中,多对多关联通常通过中间表来实现,而JPA提供了一种声明式的方式来处理这种关联。在双向关联中,两个...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第14讲 JPA中的多对多双向关联的各项关系操作.avi
JPA中的多对多双向关联的各项关系操作** 多对多关系可以进行添加、删除、查找等操作,JPA会自动处理中间表的增删改查。 **15. JPA中的联合主键** 联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个...
在现代企业管理中,员工薪酬关系系统的构建至关重要,它能够高效、准确地处理员工的工资、福利、奖金等各项收入,以及相关的税务计算和社保缴纳等问题。本项目采用Springboot后端框架与Vue前端框架相结合的方式,为...
4. **Java Persistence API(JPA)2.0**:JPA是ORM(对象关系映射)的标准,2.0版本增强了对多对多关联的支持,添加了查询语言JPA QL,以及实体图形化的查询API(Criteria API),使得数据库操作更为便捷。...
服务端使用redis技术缓存数据,可以为分布式系统提供session登录服务,使用了spring-data-jpa简化了数据库操作,提供API依照RESTful规范,且使用webSocket协议实现服务端与客户端的双向通信。物联网技术是利用传感器...
这些表之间通过外键关联,形成完整的数据模型,支持系统的各项功能。 4. **关键功能** - **用户管理**:包括用户的注册、登录、权限管理等。 - **课程管理**:教师创建、编辑和删除课程,学生可以选课。 - **...
2. **JPA 2.1**: Java Persistence API在2.1版本中增加了对JSON的支持,使得对象关系映射(ORM)能够直接处理JSON数据,同时也增强了对多对多关联的处理。 3. **JSF 2.2**: JavaServer Faces(JSF)2.2版本带来了更...