org.hubinate.PersistentObjectException:传递给持久化的分离实体:多对一单向



我正在尝试在春季启动时使用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 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.PersistentObjectException引起:传递给持久化的分离实体:jpa.many.to.one.unidirectory.model.University位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventLister.java:120)位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)位于org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:744)位于org.hibernate.internal.SessionImpl.persistent(SessionImpl.java:712)网址:org.hibernate.engine.spi.CastingActions$7.cascade(CascadingActions.java:298)网址:org.hibernate。engine.internal.Castcade.cascadeToOne(Cascade.java:492)网址:org.hibernate。engine.internal.Castcade.cascadeAssociation(Cascade.java:416)位于org.hibernate.engine.internal.Castcade.cascadeProperty(Cascade.java:218)网址:org.hibernate。engine.internal.Castcade.Cascade(Cascade.java:151)位于org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventLister.java:427)位于org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventLister.java:264)位于org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventLister.java:193)位于org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventLister.java:135)位于org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventLister.java:185)位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventLister.java:128)位于org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventLister.java:55)位于org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)位于org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:720)位于org.hibernate.internal.SessionImpl.persistent(SessionImpl.java:706)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于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.ioke(Method.java:567)位于org.springframework.om.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreater.java:314)网址:com.sun.proxy.$Proxy55.persistent(未知来源)网址:org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:554)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)位于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.ioke(Method.java:567)位于org.springframework.data.repository.core.support.ElementationInvocationMetadata.ioke(ImplementationInvoationMetadata.java:72)位于org.springframework.data.restore.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:382)位于org.springframework.data.repository.core.support.RepositoryComposition.ioke(RepositoryComposition.java:205)位于org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.ioke(RepositoryFactorySupport.java:550)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.data.repository.core.support.QueryExecutiorMethodInterceptor.doInvoke(QueryExecutiorMethod Interceptor.java:155)网址:org.springframework.data.repository.core.support.QueryExecutiorMethodInterceptor.ioke(QueryExecutiorMethod Interceptor.java:130)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.data.project.DefaultMethodInvokingMethodInterceptor.ioke(DefaultMethodInvokingMethodInterceptor.java:80)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.transaction.intercept.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)位于org.springframework.transaction.interceptor.TransactionInterceptor.ininvoke(TransactionInterceptor.java:118)网址:org.springframework.aop.framework.ReflectiveMethodInvocation.prough(ReflectiveMethodInvocation.java:186)位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.ioke(PersistenceExceptionTranslationInterceptor.java:139)…还有13个

我尝试了cascade.merge和optional-=false的多对一注释。但是我得到了上面提到的错误请帮助

@ManyToOne(cascade=CascadeType.ALL)在你的情况下,这似乎是一个坏主意,因为删除一名学生将导致删除相关的大学。由于一所大学可以有多名学生,另一名学生将成为孤儿

我认为你应该在大学实体中使用这种关系,而不是学生实体

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="STUDENT_ID")
private List<Student> students;

如果你想使用你的模型,请在将其设置在学生中之前尝试保存大学(因为在你的代码中,你试图保存同一所大学两次,第一次是fstudent,第二次是fsstudent1),在这种情况下,我建议你不要使用级联:

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);

最新更新