Java Spring数据JPA多通双向
问题:在我尝试向数据库中添加学生OBEJCT之前,它一直有效,但表的创建是正确的。 我不能再简化这篇文章了。但它主要是不需要大量阅读的代码,它是一个简单的spring数据存储库服务模型。我发布这一切都是因为idk我做错了什么。问题在于JPA映射。 我从这里得到了这个例子 MDOELSJava Spring数据JPA多通双向,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,问题:在我尝试向数据库中添加学生OBEJCT之前,它一直有效,但表的创建是正确的。 我不能再简化这篇文章了。但它主要是不需要大量阅读的代码,它是一个简单的spring数据存储库服务模型。我发布这一切都是因为idk我做错了什么。问题在于JPA映射。 我从这里得到了这个例子 MDOELS @Entity public class Department { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int
@Entity
public class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy="department")
private Collection<Student> students;
public Department() {
}
public Department(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public Collection<Student> getStudents() {
return students;
}
public void setStudent(Collection<Student> students) {
this.students = students;
}
public String toString() {
return "Department id: " + getId() +
", name: " + getName();
}
}
@Entity
public class Student {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne (cascade=CascadeType.ALL)
private Department department;
public Student() {
}
public Student(String name, Department department) {
this.name = name;
this.department = department;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public String toString() {
return "\n\nID:" + id + "\nName:" + name + "\n\n" + department;
}
}
我不能完全理解你们的问题,但我想补充一点。添加操作的级联未实现或不完整。希望对您有所帮助。您添加了cascade=CascadeType.ALL for Department in Student class,并将departments单独保存<代码>this.departmentService.addToDataBase(部门)代码> 修理工:不要打电话
departmentService.addToDataBase(departments);
或者从Student中删除CascadeType.ALL为什么每个人都在他们的示例中添加CascadeType,而当我添加它时,它会破坏一切?它没有破坏一切,您添加CascadeType并尝试管理部门。你混淆了两个概念。如果只添加级联,它应该可以工作。此外,如果您只与学生分开的部门合作(在保存学生时不要试图保存部门),那么它也应该起作用。您是否有这样的示例,即他们同时具有级联类型和管理的cacsadede实体?sbjavateam i首先添加部门,然后添加学生?在我的主要方法中,在主类中的示例中,保存了student-em.persist(student);但是部门没有相同的名称,没有em.persist(dept)。系作为studentWho的一部分创建,谁是关系的所有者?从学生到系的外键。有什么地方可以让我用JPACan学习spring boot数据吗?你可以把
@JoinColumn
添加到部门顶部吗?我可以邀请stackoverflow聊天一会儿,向我解释级联类型吗?在关系上使用级联类型注释,自动对其子关系实体执行插入删除等操作。
@Service
public class StudentService {
private final StudentRepository studentRepository;
@Autowired
public StudentService(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
public void addToDatabase(Student student) {
this.studentRepository.saveAndFlush(student);
}
public Student getStudentByName(String name) {
return studentRepository.findByName(name);
}
}
@Service
public class DepartmentService {
private final DepartmentRepository departmentRepository;
@Autowired
public DepartmentService(DepartmentRepository departmentRepository) {
this.departmentRepository = departmentRepository;
}
public void addToDataBase(List<Department> department) {
this.departmentRepository.save(department);
department.forEach(this.departmentRepository::saveAndFlush);
}
public Department getDepartmentByName(String name){
return this.departmentRepository.findByName(name);
}
}
@Component
public class Terminal implements CommandLineRunner {
private final StudentService studentService;
private final DepartmentService departmentService;
@Autowired
public Terminal(StudentService studentService, DepartmentService departmentService) {
this.studentService = studentService;
this.departmentService = departmentService;
}
@Override
public void run(String... strings) throws Exception {
Department department = new Department("dep1");
Department department1 = new Department("dep2");
Department department2 = new Department("dep3");
Department department3 = new Department("dep4");
List<Department> departments = new ArrayList<>(Arrays.asList(department, department1, department2, department3));
this.departmentService.addToDataBase(departments);
//
Student student = new Student("pesho", department);
Student student11 = new Student("gosho", department1);
this.studentService.addToDatabase(student11);
this.studentService.addToDatabase(student);
student = new Student("sasho", department2);
this.studentService.addToDatabase(student);
// System.out.println(this.studentService.getStudentByName("gosho").getDepartment1());
// System.out.println("CHECKING ONE TO ONE BIDIRECTIONAL: " + this.departmentService.getDepartmentByName("dep1").getStudent());
}
}
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: app.models.Department
departmentService.addToDataBase(departments);