当前位置: 首页 > 知识库问答 >
问题:

添加Spring事务时三重关联的持久性

柳晔
2023-03-14

我有一个使用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() {
         }
    
        ...
    }
    

    使用者

    @Entity
    @Table(name="utilisateur")
    public class Utilisateur implements Serializable {
    
         /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;
    
     /** The id utilisateur. */
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id_utilisateur", unique=true, nullable=false)
     private Integer idUtilisateur;
    
      /** The nom utilisateur. */
     @Column(name="nom_utilisateur", nullable=false, length=50)
     private String nomUtilisateur;
    
     //bi-directional many-to-one association to ProjetUtilDroit
     /** The projet util droits. */
     @OneToMany(mappedBy="utilisateur", cascade={CascadeType.REMOVE})
     private Set<ProjetUtilDroit> projetUtilDroits;
    
          ...
      }
    

    对吧

    @Entity
    @Table(name="droit")
    public class Droit implements Serializable {
    
      /** The Constant serialVersionUID. */
     private static final long serialVersionUID = 1L;
    
     /** The id droit. */
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="id_droit", unique=true, nullable=false)
     private Integer idDroit;
    
     /** The type droit. */
     @Column(name="type_droit", nullable=false, length=10)
     private String typeDroit;
    
         /**
          * Instantiates a new droit.
          */
         public Droit() {
         }
        ...
    }
    

    以及将用户链接到具有特定权限的项目的关联(ProjectUserRight)

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

    关联的嵌入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;
    }
    

    它就像一个魅力(保持项目和相关的用户权限),直到我在“createProject”方法上方添加注释@Transactional。。。

    我认为唯一的解决方案是在一个事务中创建项目,并在另一个事务中单独保存它的权利。这是唯一的解决办法吗?或者有人有其他建议吗?

  • 共有1个答案

    宇文卓
    2023-03-14

    哪个对象没有被持久化?包括完整的异常。

    您需要将与对象的关系标记为级联持久化,或者在持久化项目之前对对象调用持久化。

     类似资料:
    • 我目前正在使用Java EE/Eclipselink和PostgreSQL开发一个web应用程序。关于我的实体,我特别管理“Project”、“User”和“Right”(读、写、删除等访问权限)。这些实体之间的关系是:一个项目可以有多个对该项目拥有不同权限的用户。因此,我得到了一个三重关联:Project+User+Right。 在这个协会坚持的过程中,我面临着一个恼人的问题。当我用它的信息持久

    • 我对Spring注释和persist有一个误解。我使用的是Spring3.1,带有JPA和Hibernate。我认为persist意味着将实体添加到持久性上下文中(但在提交或刷新之前不要执行任何查询),而注释意味着用事务包装方法。 然而,在这个简短的例子中,当执行指针到达持久性时,它会失败并出现异常,因为name不能为null(db约束)。 如果我交换和,一切正常。然而,我不明白为什么反过来没有,

    • 主要内容:1.事务核心类图,2.getTransaction 获取事务,3.commit 提交事务,4.rollback回滚事务1.事务核心类图 PlatformTransactionManager: 顶级核心接口, 定义了事务管理方法 AbstractPlatformTransactionManager: 实现了PlatformTransactionManager方法, 并定义了一些抽象方法, 子类扩展 DataSourceTransactionmanager: Jdbc单数据库事务管理器,

    • 接口说明 如果用户想对比两个场景中的数据(如历史数据对比、规划前后的数据对比等)来统计一些信息,Wish3DEarth团队新增了双屏对比的接口,开发者可以通过该接口,来建立主屏与副屏之间的关联性。 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/contrasts/1.0.0/add 是否需要登录 是 请求字段说明 参数

    • 主要内容:JPA级联持久化示例,输出结果级联持久化用于指定如果实体持久化,则其所有关联的子实体也将被持久化。 以下语法用于执行级联持久性操作 - JPA级联持久化示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步:

    • 当向我的Maven-Java-project添加持久性时,我可以成功地构建和编译(Netbeans中的“清理和构建项目”,我假设它确实mvn站点)项目,但是我将无法在之后启动它(Netbeans中的“运行项目”)。 我已经尝试了一段时间而没有成功。例如,我试图删除pom中的组织.codehaus.mojo插件.xml尽管我的成功没有变化。 有人知道这个问题吗?我对MySQL数据库的设置有没有配置错