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

Spring data jpa存储库save()对ManyToMany不起作用

卫宏硕
2023-03-14

我在java应用程序中遇到以下异常。

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.DatabaseException
public class MyEntity {
    @Id
    @SequenceGenerator( name = "MyEntitySeq", sequenceName = "SQ_ENTITY", allocationSize = 1, initialValue = 1 )
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "MyEntitySeq")
    @Column(name = "ID")
    private Integer id;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "MY_JOINED_TABLE", 
    joinColumns = {
            @JoinColumn(name = "e_id", referencedColumnName = "ID")}, 
    inverseJoinColumns = {
            @JoinColumn(name = "inverse_id", referencedColumnName = "ID")})
    private Set<Attributes> attributes;

}

我对entity表中的其他3个字段有一个唯一的约束,对attributes表中的name、Value有一个唯一的约束。当我尝试persist an实体(它有一组属性)时,repository.save()方法会失败,原因有两个:1。属性表中可能已经存在一个属性,由于唯一约束(这是我想要的。但我仍然想创建与实体的这些属性的关联)而无法插入2。实体可能已经存在,但违反了唯一约束。(我仍然想插入数据库中还没有的属性,并创建与此实体的属性关联)。

如果这些实体/属性不在数据库中,它可以正常工作,并且spring会插入到所有3个表中,包括连接和所有内容。

如果对没有关联的表执行repository.save()操作,即使对同一个主键执行save()操作,也会更新这些表。

为什么在我的很多人身上不起作用?

共有1个答案

孟子墨
2023-03-14

试试这个(对不起我的英语,我不懂Spring MVC和Hibernate),我有类似的问题,这点很重要:

  1. 您需要get elements第三个要与第一个实体关联到同一事务中的实体。
  2. 确保在persistence-context-xml中有
 类似资料:
  • 我正在尝试更新数据,据我所知,save()方法在id为空时保存实体,或者在DB中找到给定id时更新数据库中现有的实体。 但是,当我尝试保存数据时,它不会被更新: 但是,当我从数据库检索数据并更新其字段并再次保存时,它会更新: 和实体:

  • 我想在我的存储库中的save/saveAll方法中添加一个装饰器。 我试图通过阅读此线程使用自定义实现来覆盖方法,但我不想重写方法实现,只需调用具有更多行为的默认方法。提供的解决方案都不适合我的情况,或者需要太多的自定义。 我可以从方法体中手动调用缓存逐出,但我不能只覆盖方法并调用super。save(),因为我只使用接口,让Spring生成实现。 有什么建议吗?

  • 这根本不是关于Spring靴的。 我的英语可以更好。 使用下面的Spring Data配置,我正在尝试执行DML请求。 恰好是< code>CrudRepository#save方法。 然而,执行Spring的CrudRepository#保存方法,我接下来要做的是: 只有选择由功能记录。 没有执行任何“插入”或“更新”语句来hibernate.show_sql日志记录。 数据库根本没有变化。 =

  • 这类似于在无法使用两个带有Spring Boot/Spring数据Neo4j的Neo4j实例中讨论的内容,但我没有两个数据库。我从git repo下载了spring data neo4j示例java应用程序,希望执行动态查询,而不是通过存储库接口执行静态查询。 我面临一个空事务管理器的问题。 这是我的界面: 以下是我的自定义回购建议: 以下是我的配置: 因为我只有一个TransactionMana

  • 我正在构建一个使用Spring data jpa特性的Spring-boot应用程序。 请在我的dao层代码下面找到 我正在使用一个DaoProvider类,如下所示: 我的spring boot主类定义如下: 现在,在运行时,我得到以下异常:

  • 问题内容: 我把毛巾扔了。我不明白,这有多困难? 我有两个实体和具有多对多的关系。管理关系。所以我有: 然后为我创建实体,如下所示: 然后,在我的后备bean(实际上是一个)中,我以相同的名称存储对检索到的引用作为属性。 然后我在我的JSF中皇家使用了那个支持bean 对于那些对表感兴趣的人: 注意到的第一件事是组似乎是空的,不是空的,而是空的(已通过调试等验证)。因此,我知道默认情况下a 将使用