Java org.hibernate.PersistentObjectException:传递给persist的分离实体:多对一单向
我尝试在spring boot中使用hibernate进行多对一单向映射。 我有以下几个学生班——很多Java org.hibernate.PersistentObjectException:传递给persist的分离实体:多对一单向,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,我尝试在spring boot中使用hibernate进行多对一单向映射。 我有以下几个学生班——很多 package jpa.many.to.one.unidirectional.model; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import
package jpa.many.to.one.unidirectional.model;
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.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "STUDENT")
public class Student {
@Id
@GeneratedValue
@Column(name = "STUDENT_ID")
private long id;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="UNIVERSITY_ID")
private University university;
public Student() {
}
public Student(String firstName, String lastName, String section, University university) {
this.firstName = firstName;
this.lastName = lastName;
this.section = section;
this.university = university;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName="
+ lastName + ", section=" + section + "]";
}
}
大学一班
package jpa.many.to.one.unidirectional.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "UNIVERSITY")
public class University {
@Id
@GeneratedValue
@Column(name = "UNIVERSITY_ID")
private long id;
@Column(name = "NAME")
private String name;
@Column(name = "COUNTRY")
private String country;
public University() {
}
public University(String name, String country) {
this.name = name;
this.country = country;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "University [id=" + id + ", name=" + name + ", country=" + country + "]";
}
}
应用程序保存并运行为
package jpa.many.to.one.unidirectional;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import jpa.many.to.one.unidirectional.model.Student;
import jpa.many.to.one.unidirectional.model.University;
import jpa.many.to.one.unidirectional.repo.StudentRepo;
import jpa.many.to.one.unidirectional.repo.UniversityRepo;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// SpringApplication.run(Application.class, args);
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(Application.class, args);
UniversityRepo universityRepo = configurableApplicationContext.getBean(UniversityRepo.class);
StudentRepo studentRepo = configurableApplicationContext.getBean(StudentRepo.class);
University university = new University("MG", "India");
Student fstudent = new Student("Deeksha", "Sivakumar", "A", university);
fstudent.setUniversity(university);
studentRepo.save(fstudent);
Student fstudent1 = new Student("Sivakumar", "Nair", "A", university);
fstudent1.setUniversity(university);
studentRepo.save(fstudent1);
}
}
但我明白了
原因:org.hibernate.persistentObject异常:传递给persist的分离实体:jpa.many.to.one.单向.model.University
位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:120)
位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
位于org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:744)
位于org.hibernate.internal.SessionImpl.persist(SessionImpl.java:712)
位于org.hibernate.engine.spi.CascadingActions$7.cascade(CascadingActions.java:298)
位于org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:492)
位于org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:416)
位于org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:218)
位于org.hibernate.engine.internal.Cascade.Cascade(Cascade.java:151)
位于org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:427)
位于org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264)
位于org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
位于org.hibernate.event.internal.AbstractSaveEventListener.SaveWithGenerateId(AbstractSaveEventListener.java:135)
位于org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185)
位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128)
位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55)
位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
位于org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:720)
位于org.hibernate.internal.SessionImpl.persist(SessionImpl.java:706)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:567)
位于org.springframework.orm.jpa.SharedEntityManagerCreator$SharedentityManagerInvoke.invoke(SharedEntityManagerCreator.java:314)
位于com.sun.proxy.$Proxy55.persist(未知源)
位于org.springframework.data.jpa.repository.support.simplejperparepository.save(SimpleJpaRepository.java:554)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.base/java.lang.reflect.Method.invoke(Method.java:567)
位于org.springframework.data.repository.core.support.ImplementationInvocationMetadata.invoke(ImplementationInvocationMetadata.java:72)
位于org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:382)
位于org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:205)
位于org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:550)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:155)
位于org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:130)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:367)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:186)
位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 还有13个
我在多对一注释中尝试了cascade.merge和optional-=false。但是我得到了上面提到的错误
请帮助@ManyToOne(cascade=CascadeType.ALL)
在你的情况下,这似乎是个坏主意,因为开除一名学生会导致开除相关的大学。由于一所大学可以有多个学生,另一个学生将成为孤儿
我认为你应该在大学实体中使用这种关系,而不是学生实体
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="STUDENT_ID")
private List<Student> students;
早上好,阿扎比!!!谢谢你的回复。在为学生设定学生价值观和大学价值观之前,我为大学做了一次明确的储蓄。还删除了cascade all,并在学生课堂上的大学参考资料中给出了@ManyToOne(可选=false)。。。我的要求是每个学生都应该有大学参考资料现在我得到了我的预期结果我还有一个问题。。。保持着同样的关系。。我怎样才能让一个新的孩子进入同一所大学我也找不到可以接受的选择。。
University university = universityRepo.save(new University("MG", "India"));
Student fstudent = new Student("Deeksha", "Sivakumar", "A", university);
fstudent.setUniversity(university);
studentRepo.save(fstudent);
Student fstudent1 = new Student("Sivakumar", "Nair", "A", university);
fstudent1.setUniversity(university);
studentRepo.save(fstudent1);