Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 添加Spring事务时三重关联的持久性_Jpa_Associations_Persistence_Eclipselink_Spring Transactions - Fatal编程技术网

Jpa 添加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

我有一个使用JPA(EclipseLink)和Spring框架的JavaEE应用程序

在我添加Spring事务管理之前,在我的持久性类中一切都很好。 我有以下实体(对应于数据库表):

  • 计划

    @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;
}