本例来至于 :itcast
第一步:
照样导入JPA实现的产品jar包
在classpath下建立META-INF persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<!-- 以transaction-type下是 事务提交类型有两种事务:第一、本地事务(在同一个数据库中完成事务) 第二、全局事务(在不同数据库中需要在同一事务中完成不同数据库的操作)-->
<persistence-unit name="person" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 使用的方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
<!-- 数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!-- 数据库密码 -->
<property name="hibernate.connection.password" value="liyong" />
<!-- 数据库连接url -->
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=UTF-8" />
<!-- 表结构发生变化的时候更新表结构 ,表不存在是创建表-->
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
第二步:编写Student.java Teacher。java
Student.java
/**
* 多对多JPA规范没有规定关系维护端 可以根据我们自己觉得
*
* @author Administrator
*
*/
@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;
}
@ManyToMany(cascade = CascadeType.REFRESH)
// @JoinTable指定这个关联表如果不使用则外键表外键名使用默认值
// joinColumns指定关联表外键名(关系维护端)
// inverseJoinColumns指定关联表外键名(关系被维护端)
@JoinTable(name = "stuent_teacher", joinColumns = @JoinColumn(name = "student"), inverseJoinColumns = @JoinColumn(name = "teacher"))
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
* 建立关联关系 对应到关联表是建立关联外键关系
*/
public void addTeachers(Teacher teacher) {
this.teachers.add(teacher);
}
/*
* 解除关系 对应到关联表是删除关联外键关系
*
*
*/
// 下面判断这个对象是否存在根据重写hashCode()和equeals()
public void removeTeahcer(Teacher teacher) {
if (this.teachers.contains(teacher)) {
this.teachers.remove(teacher);
}
}
/*
* 判断该对象是否为同一对象使用Id来判断
*/
@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;
Student other = (Student) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
Teachar.java
@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;
}
public Teacher(String name ,Integer id){
this.name=name;
this.id=id;
}
@ManyToMany(cascade=CascadeType.REFRESH,mappedBy="teachers")
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第三步: 编写单元测试
@Test
public void save()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Student student=new Student("李勇");
//将学生持久化到数据库
entity.persist(student);
//将老师持久化到数据库
Teacher teacher=new Teacher("张老师");
entity.persist(teacher);
entity.getTransaction().commit();
entity.close();
factor.close();
}
/**
* 建立学生跟老师的关系
*/
@Test
public void BuildTS()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Student student=entity.find(Student.class,1);
student.addTeachers(entity.getReference(Teacher.class,1));
//此时建立学生和老师的关系 --》创建关联表
entity.getTransaction().commit();
entity.close();
factor.close();
}
/**
* 删除学生跟老师的关系
*/
@Test
public void DeleteTS()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Student student=entity.find(Student.class,1);
student.removeTeahcer(entity.getReference(Teacher.class,1));
entity.getTransaction().commit();
entity.close();
factor.close();
}
/*
* 删除老师(关系被维护端)先解除关系,然后删除对象
*/
@Test
public void deleteTeacher()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Student student=entity.find(Student.class,1);
Teacher teacher=entity.getReference(Teacher.class,1);
student.removeTeahcer(teacher);
entity.remove(teacher);
entity.getTransaction().commit();
entity.close();
factor.close();
}
/*
* 删除学生 因为这里是Student为关系维护端所有删除学生时不用先删除关系
*/
@Test
public void deleteStudent()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Student student=entity.find(Student.class,1);
entity.remove(student);
entity.getTransaction().commit();
entity.close();
factor.close();
}
}
第四步:测试....
源代码见附件:
分享到:
相关推荐
"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置"这一部分则专门聚焦于多对多关联的实践。 在关系型数据库中,多对多关联是最为复杂的一种关系...
本资料“13_JPA详解_JPA中的多对多双向关联实体定义与注解设置”专注于讲解JPA如何处理多对多双向关联关系,这是数据库设计中常见的一种复杂关联类型。下面我们将详细探讨这一主题。 首先,我们需要理解多对多关联...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第13讲 JPA中的多对多双向关联实体定义与注解设置.avi
这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...
在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...
本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...
本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...
本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...
在JPA中实现一对一双向关联需要在两个实体类中分别定义关系。 首先,我们来看如何在实体类中定义一对一的关联。假设我们有`Employee`和`Department`两个实体,它们之间是一对一的关系。在`Employee`实体中,我们...
在JPA中实现这样的关联,需要在实体类上定义相应的注解,并配置关联关系。 在JPA中,我们可以使用`@OneToOne`注解来声明一对一的关系。如果这个关联是双向的,我们需要在两个实体类中都添加注解。在其中一个实体类...
在本教程中,我们将深入探讨JPA中的多对多双向关联及其各项操作。 ### 1. 多对多关联基础 在关系型数据库中,多对多关联通常通过中间表来实现,而JPA提供了一种声明式的方式来处理这种关联。在双向关联中,两个...
在`Employee`实体中,`@ManyToOne`注解表示多对一的关系,`@JoinColumn`注解指定了外键所在的列名。 为了使双向关联正常工作,还需要在每个实体的setter方法中添加一些额外的逻辑,以确保两边的关系同步: ```java...
总的来说,JPA的`@OneToOne`注解提供了处理一对一关联的强大工具,尤其是在处理双向关联时。正确理解和使用这些关联,能够帮助我们更好地进行对象与数据库之间的映射,提高代码的可读性和维护性。在实际项目中,应...
本文将深入探讨在JPA中如何实现双向多对多的关联关系,并提供相关的示例代码。 首先,我们需要了解多对多关联关系的基本概念。在关系型数据库中,两个实体之间可能存在多对多的关系,意味着每个实例可以从一个实体...
此外,可以使用`@OrderColumn`来指定中间表中关联实体的排序。 3. **一对一关联(JPAOneToOne)** 一对一关联意味着一个实体实例对应另一个实体的唯一实例。JPA通过`@OneToOne`注解来表示这种关系。可选地,你可以...
首先,我们来看如何在Java中使用JPA(Java Persistence API)或Hibernate(一个流行的JPA实现)来设置多对多双向关联。双向关联意味着两个实体类都将持有对彼此的引用。例如,考虑一个“学生”和“课程”的场景,每...
本示例中的“JPA多对多Demo”是一个具体的实践案例,展示了如何在JPA中实现多对多关联关系,以及对应的增删改查方法。 多对多关联是现实世界中常见的一种关系类型,例如教师和学生之间的关系,一个教师可以教多个...
JPA 提供了多种方式来处理不同类型的关联关系,包括单向多对一、单向一对多、双向一对一、双向多对一和双向多对多。下面我们将详细探讨这些关联关系的实现方法。 1. **单向多对一关联关系(SingleManyToOne)** 在...