Spring数据jpa存储库save()不适用于ManyToMany

时间:2016-03-24 17:54:39

标签: sql oracle many-to-many spring-data-jpa jointable

我的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

内部异常:java.sql.SQLIntegrityConstraintViolationException:ORA-00001:违反了唯一约束(USER1.ID_TYPE_TENANT_UNIQUE)。

我有一个数据模型,在两个表之间设置了ManyToMany关联。两者之间有一个JoinTable,我就像这样设置实体。

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;

}

我对实体表中的其他3个字段有唯一约束,对name,value上的属性表有唯一约束。当我尝试持久化具有一组属性的实体时,repository.save()方法会因以下原因而失败:  1.一个属性可能已经存在于属性表中,并且由于唯一约束而无法插入(这就是我想要的。但我仍然希望创建与这些属性的关联到实体) 2.实体可能已经存在但违反了唯一约束。 (我还想插入数据库中已经存在的属性,并创建与该实体的关联属性)。

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

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

为什么它不适用于我的多种情况?

1 个答案:

答案 0 :(得分:0)

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

  1. 您需要将要与第一个实体关联的元素第三个实体添加到同一个事务中。
  2. 确定你的persistence-context-xml