Jpa 添加Spring事务时三重关联的持久性
我有一个使用JPA(EclipseLink)和Spring框架的JavaEE应用程序 在我添加Spring事务管理之前,在我的持久性类中一切都很好。 我有以下实体(对应于数据库表):Jpa 添加Spring事务时三重关联的持久性,jpa,associations,persistence,eclipselink,spring-transactions,Jpa,Associations,Persistence,Eclipselink,Spring Transactions,我有一个使用JPA(EclipseLink)和Spring框架的JavaEE应用程序 在我添加Spring事务管理之前,在我的持久性类中一切都很好。 我有以下实体(对应于数据库表): 计划 @Entity @Table(name="projet") public class Projet implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strat
- 计划
@Entity @Table(name="projet") public class Projet implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id_projet", unique=true, nullable=false) private Integer idProjet; @Column(name="nom_projet") private String nomProjet; /** The projet util droits. */ @OneToMany(mappedBy="projet", cascade={CascadeType.ALL}) private Set<ProjetUtilDroit> projetUtilDroits; public Projet() { } ... }
- 以及将用户链接到具有特定权限的项目的关联(ProjectUserRight)
- 关联的嵌入id:
@Embeddable public class ProjetUtilDroitPK implements Serializable { //default serial version id, required for serializable classes. /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /** The id projet. */ @Column(name="id_projet", unique=true, nullable=false) private Integer idProjet; /** The id utilisateur. */ @Column(name="id_utilisateur", unique=true, nullable=false) private Integer idUtilisateur; ... }
public Projet createProject(String name, int idRight, int idUser) {
Projet project = new Projet();
project.setNomProjet(name);
ProjetUtilDroit pud = new ProjetUtilDroit();
Droit d = rightDao.findById(idRight);
pud.setDroit(d);
pud.setProjet(project);
Utilisateur user = userDao.findById(idUser);
pud.setUtilisateur(user);
if(user.getProjetUtilDroits() == null)
user.setProjetUtilDroits(new HashSet<ProjetUtilDroit>());
user.getProjetUtilDroits().add(pud);
Set<ProjetUtilDroit> pudSet = new HashSet<ProjetUtilDroit>();
pudSet.add(pud);
project.setProjetUtilDroits(pudSet);
project = projectDao.create(project);
return project;
}
public Projet createProject(字符串名,int-idRight,int-idUser){
Projet项目=新建Projet();
项目名称:setNomProjet(名称);
ProjetUtilDroit pud=新的ProjetUtilDroit();
Droit d=rightDao.findById(idRight);
普德·塞德洛伊特(d);
pud.setProjet(项目);
usilisateur user=userDao.findById(idUser);
pud.SetUsilizateur(用户);
if(user.getProjetUtilDroits()==null)
setProjetUtilDroits(新的HashSet());
user.getProjetUtilDroits().add(pud);
Set pudSet=新HashSet();
添加(pud);
项目。setProjetUtilDroits(布吉);
project=projectDao.create(项目);
返回项目;
}
在我将注释@Transactionnal添加到“createProject”方法上方之前,它就像一个符咒一样工作(保留项目和相关的用户权限)
现在我得到了这个错误:
Avertissement:StandardWrapperValve[dispatcher]:PWC1406:Servlet dispatcher的Servlet.service()引发异常
java.lang.IllegalStateException:同步期间,通过未标记为cascade PERSIST的关系找到了新对象:
******项目右侧******
用户名:用户名权限:读取。
位于org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.DiscoveryUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:304)
位于org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:702)
位于org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:433)
位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:780)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.performPreQueryFlush(EJBQueryImpl.java:1298)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:434)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:742)
位于com.dao.BasicDAO.findAll(BasicDAO.java:92)
创建(BasicDAO.java:103)
位于com.services.ProjectService.createProject(ProjectService.java:48)
在com.services.ProjectService$$FastClassByCGLIB$$67c85b9f.invoke()上
net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
位于org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:150)上
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
位于org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
在com.services.ProjectService$$enhancerbyglib$$398fa756.createProject()上
位于com.servlet.Test.handleCreateProject(Test.java:31)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
位于org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
位于org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
位于org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
位于org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
位于com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
位于com.sun.enterprise.v3.services.impl.Containe
@Entity
@Table(name="projet_util_droit")
public class ProjetUtilDroit implements Serializable {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The id. */
@EmbeddedId
private ProjetUtilDroitPK id;
//bi-directional many-to-one association to Droit
/** The droit. */
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_droit")
private Droit droit;
//bi-directional many-to-one association to Projet
/** The projet. */
@MapsId("idProjet")
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_projet")
private Projet projet;
//bi-directional many-to-one association to Utilisateur
/** The utilisateur. */
@MapsId("idUtilisateur")
@ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="id_utilisateur")
private Utilisateur utilisateur;
...
}
@Embeddable
public class ProjetUtilDroitPK implements Serializable {
//default serial version id, required for serializable classes.
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The id projet. */
@Column(name="id_projet", unique=true, nullable=false)
private Integer idProjet;
/** The id utilisateur. */
@Column(name="id_utilisateur", unique=true, nullable=false)
private Integer idUtilisateur;
...
}
public Projet createProject(String name, int idRight, int idUser) {
Projet project = new Projet();
project.setNomProjet(name);
ProjetUtilDroit pud = new ProjetUtilDroit();
Droit d = rightDao.findById(idRight);
pud.setDroit(d);
pud.setProjet(project);
Utilisateur user = userDao.findById(idUser);
pud.setUtilisateur(user);
if(user.getProjetUtilDroits() == null)
user.setProjetUtilDroits(new HashSet<ProjetUtilDroit>());
user.getProjetUtilDroits().add(pud);
Set<ProjetUtilDroit> pudSet = new HashSet<ProjetUtilDroit>();
pudSet.add(pud);
project.setProjetUtilDroits(pudSet);
project = projectDao.create(project);
return project;
}