Java Spring data jpa具有相同标识符值的不同对象已与会话关联

Java Spring data jpa具有相同标识符值的不同对象已与会话关联,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我已经寻找了一个很好的解决方案,但仍然没有解决方案 @Entity @Table(name = "documents") public class Documents { @Id @Column(name = "doc_id", unique = true, nullable = false) private String id; @Column(name = "type") private String type; @Column(name

我已经寻找了一个很好的解决方案,但仍然没有解决方案

@Entity
@Table(name = "documents")
public class Documents {

    @Id
    @Column(name = "doc_id", unique = true, nullable = false)
    private String id;

    @Column(name = "type")
    private String type;

    @Column(name = "url")
    private String url;

}

public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_id", unique = true, nullable = false)
    private Integer addressId

    @OneToMany(cascade = { CascadeType.ALL })
    @JoinTable(name = "address_docs", joinColumns = @JoinColumn(name = "address_id"), inverseJoinColumns = @JoinColumn(name = "doc_id"))
    private List<Documents> doc;

}

public class Grd {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "grd_id", unique = true, nullable = false)
    private Integer grdId

    @OneToMany(cascade = { CascadeType.ALL })
    @JoinTable(name = "grd_docs", joinColumns = @JoinColumn(name = "grd_id"), inverseJoinColumns = @JoinColumn(name = "doc_id"))
    private List<Documents> doc;

}

public class Person {

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "grd_id", referencedColumnName = "grd_id")
    private Grd grd;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", referencedColumnName = "address_id")
    private Address address;

}
基于我的解决方案,我发现我已经将CascadeType更改为合并类地址和Grd。但现在我得到了错误

org.springframework.dao.DataIntegrityViolationException: A different object with the same identifier value was already associated with the session
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [fk_address_doc_2]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

我如何才能做到这一点?

向我们展示完整的代码。如何声明
地址
Grd
的ID?为什么您要尝试重新使用联接表
地址\u文档
用于
地址
Grd
?@crizzis我已将ID添加到代码中,它们是自动生成的。地址和Grd的文件是一个打字错误。更正此问题。是否有可能将相同的
文档
添加到
地址
Grd
?如果是这样,我会先尝试保存
文档。该错误听起来好像您试图在
Address.doc
列表中放置重复项,though@crizzis是的,我在地址和Grd中有相同的文档,因此我不想创建重复记录。我使用第三方API获取数据并将其加载到我的数据库中。请让我知道是否可以通过调用personRepo.save(person)一次性保存对象;我怀疑问题在于Hibernate将这两个文档视为新实体,这会导致两个独立的insert语句。可能不可能一次完成;正如我所说,您可以尝试先管理所有
文档
s,然后再继续保存
人员