我的编程空间,编程开发者的网络收藏夹
学习永远不晚

(转载)Jpa配置一对多关系

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

(转载)Jpa配置一对多关系

(转载)Jpa配置一对多关系

链接: https://www.cnblogs.com/a-small-lyf/p/10699326.html

 

在网上查了很多关于jpa的一对多表关联的操作,踩了很多坑,今天终于解决了

下面上一下我自己的代码,记录一下

老师和学生(一对多关系)

首先搭建环境,添加依赖包

复制代码


         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    com.lyf
    one-to-more
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.3.RELEASE
    
    
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        
        
            mysql
            mysql-connector-java
            5.1.47
        
        
            org.springframework.boot
            spring-boot-starter-test
        
        
            org.projectlombok
            lombok
            1.16.22
        
    
复制代码

编写数据库配置文件

复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=08186912
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
复制代码

实体类

复制代码
package com.lyf.pojo;

import lombok.Data;

import javax.persistence.*;


@Data
@Entity
@Table(name = "tb_student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "s_id")
    private Long sId;
    @Column(name = "s_name")
    private String sName;

    
    @ManyToOne(targetEntity = Teacher.class)
    @JoinColumn(name = "s_t_id",referencedColumnName = "t_id")
    private Teacher teacher;
}

package com.lyf.pojo;

import lombok.Data;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;


@Data
@Entity
@Table(name = "tb_teacher")
public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "t_id")
    private Long tId;
    @Column(name = "t_name")
    private String tName;
    //配置老师和学生一对多
    
    @OneToMany(targetEntity = Student.class)
    @JoinColumn(name = "s_t_id",referencedColumnName = "t_id")
    private Set students = new HashSet<>();
}
 
复制代码

springboot启动类(引导类)

复制代码
package com.lyf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}
复制代码

启动引导类,查看数据库会发现表生成成功

dao层代码就不上了,继承JpaRepository就行了

 

接下来我们进行保存操作

 

复制代码
package com.lyf;

import com.lyf.dao.StudentDao;
import com.lyf.dao.TeacherDao;
import com.lyf.pojo.Student;
import com.lyf.pojo.Teacher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@SpringBootTest
@RunWith(SpringRunner.class)
public class OneToMoreTest {

    @Autowired
    private TeacherDao teacherDao;
    @Autowired
    private StudentDao studentDao;
    @Test
    public void addTest(){
        Student student = new Student();
        student.setSName("老篮孩i");
        Teacher teacher = new Teacher();
        teacher.setTName("刘老师");
        //关联学生和老师,添加学生信息时,还需添加外键的值
        student.setTeacher(teacher);


        studentDao.save(student);
        teacherDao.save(teacher);
    }
}
复制代码

 

结果报错了,发现我是先保存的学生信息,再保存的老师信息,此时数据库中并没有老师的信息,给学生关联老师信息肯定是有问题的

报错信息

 

复制代码
org.springframework.dao.InvalidDataAccessApiUsageException: 
  org.hibernate.TransientPropertyValueException:
     object references an unsaved transient instance - save the transient instance before flushing : com.lyf.pojo.Student.teacher -> com.lyf.pojo.Teacher;
       nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:
         object references an unsaved transient instance - save the transient instance before flushing : 
          com.lyf.pojo.Student.teacher -> com.lyf.pojo.Teacher
复制代码

 学生表记录插入了,老师表是空的

 

 

 

改成

 

复制代码
package com.lyf;

import com.lyf.dao.StudentDao;
import com.lyf.dao.TeacherDao;
import com.lyf.pojo.Student;
import com.lyf.pojo.Teacher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@SpringBootTest
@RunWith(SpringRunner.class)
public class OneToMoreTest {

    @Autowired
    private TeacherDao teacherDao;
    @Autowired
    private StudentDao studentDao;
    @Test
    public void addTest(){
        Student student = new Student();
        student.setSName("老篮孩i");
        Teacher teacher = new Teacher();
        teacher.setTName("刘老师");
        //关联学生和老师,添加学生信息时,还需添加外键的值
        student.setTeacher(teacher);

        //要先保存主表信息
        teacherDao.save(teacher);
        studentDao.save(student);
    }
}
复制代码

 控制台信息,很显然成功了

复制代码
Hibernate: alter table tb_student add constraint FKsojy7bicq68v21slcq9mtwtou foreign key (s_t_id) references tb_teacher (t_id)
2019-04-12 23:29:42.036  INFO 10980 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit "default"
2019-04-12 23:29:42.748  INFO 10980 --- [           main] com.lyf.OneToMoreTest                    : Started OneToMoreTest in 7.77 seconds (JVM running for 9.806)
Hibernate: insert into tb_teacher (t_name) values (?)
Hibernate: insert into tb_student (s_name, s_t_id) values (?, ?)
复制代码

查看数据库也没有问题

同样我们通过Teacher表也能完成关联操作,保存也是没有问题的

复制代码
@Test
    public void addTest1(){
        Student student = new Student();
        student.setSName("老篮孩i1");
        Teacher teacher = new Teacher();
        teacher.setTName("刘老师1");

        //通过主表来添加关联
        teacher.getStudents().add(student);
        studentDao.save(student);
        teacherDao.save(teacher);
    }
复制代码

 控制打印信息

Hibernate: insert into tb_student (s_name, s_t_id) values (?, ?)
Hibernate: insert into tb_teacher (t_name) values (?)
Hibernate: update tb_student set s_t_id=? where s_id=?

 

学生类和老师类都添加类外键的配置,都具备外键的维护,那么我们这里可以通过学生找到老师,也能通过老师找到学生,这是一种双向关系

如果只配置一方,那就是单向的关系,只能通过指定的一方找到另一方

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

(转载)Jpa配置一对多关系

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

(转载)Jpa配置一对多关系

链接: https://www.cnblogs.com/a-small-lyf/p/10699326.html   在网上查了很多关于jpa的一对多表关联的操作,踩了很多坑,今天终于解决了 下面上一下我自己的代码,记录一下 老师和学生(一对多关系) 首先搭建环
(转载)Jpa配置一对多关系
2014-06-21

(转载)SpringData JPA (二) 进阶 - JPA一对多、多对多

链接: https://blog.csdn.net/qq_36662478/article/details/89111437   1 JPA中的主键生成策略   通过annotation(注解)来映射实体类和数据库表的对应关系,基于annotation的主键
(转载)SpringData JPA (二) 进阶 - JPA一对多、多对多
2018-06-05

编程热搜

目录