Hibernate JPA与具有索引列的联接表的多对多关联创建新的主键

Hibernate JPA与具有索引列的联接表的多对多关联创建新的主键,hibernate,jpa,Hibernate,Jpa,目前,我们在项目中面临着这个关键问题,不确定如何配置JPA以满足我们的需求 我们的数据库中有5个表,它们之间的关系如下 A Id B Id C Id A_B Id A_Id B_Id D Id A_B_Id C_Id 恩蒂A 以及实体A作为 @Entity Class A{ @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "A_B", joinColumns = @JoinColum

目前,我们在项目中面临着这个关键问题,不确定如何配置JPA以满足我们的需求

我们的数据库中有5个表,它们之间的关系如下

A
Id

B
Id

C
Id

A_B
Id A_Id B_Id

D
Id A_B_Id C_Id
恩蒂A

以及实体A作为

@Entity
    Class A{

        @ManyToMany(fetch = FetchType.EAGER)
        @JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "A_Id", referencedColumnName = "Id"), inverseJoinColumns = @JoinColumn(name = "B_Id", referencedColumnName = "Id"))
        @OrderColumn(name = "idx")
        private List<B> bList;
    }
在做了这个更改之后,我无法部署代码,因为JPA正在为实体C抛出异常

Caused by: org.hibernate.MappingException: Foreign key (FK76F831D84C8F0D59:D[A_B_Id])) must have same number of columns as the referenced primary key (A_B[A_Id,idx])
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
    at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1714)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1637)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
    ... 45 more

Entity C is

    @Entity
    class C{

    @ManyToMany
        @JoinTable(name = "D", joinColumns = @JoinColumn(name = "C_Id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "A_B_Id", referencedColumnName = "id"))
        private List<A_B> a_bList;
    }
所以在这里,我们不知道如何在不删除的情况下保存A,同时保持D关系的完整性。任何帮助都将不胜感激


谢谢

从那以后,a和B之间就没有太多了

A_B表映射为一个实体,因此它也不能映射为联接表 A_B表有一个ID列,如果映射为联接表,Hibernate将永远不会填充该列 出于同样的原因,C和A_B之间的关联也是如此

你应该做的是

A和AB有一个单间 B和AB有一个单间 D和AB有一个多音 D和C有一个多音
当然,所有这些关联也可以映射到另一个方向。

您好,感谢您的回复,但是在联接表中插入操作进行得很好。我只是创建了A的一个实例,并将B填充为一个列表。当我持久化A时,将使用联接表中的A和B Id创建记录。由于AB只是一个连接表,所以通过这种映射,我可以直接访问映射B的列表,否则使用您的方法,我需要循环AB列表并获得所有B的希望注释,这对您来说是有意义的。我的观点是,它填充a_ID和B_ID,但不填充ID。既然您希望将此表映射为一个实体,它也不应映射为联接表。ID在类型标识中是自动递增的,因此将自动填充。你有一个观点,AB在C中被用作一个实体,所以在a中,我们应该把它当作一个实体,而不是许多实体。但为了解决删除问题,我必须使用索引列和C,我还必须使用实体D的OneToMany。通过JPA真的不可能实现我所需要的吗?
@Entity
    Class A{

        @ManyToMany(fetch = FetchType.EAGER)
        @JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "A_Id", referencedColumnName = "Id"), inverseJoinColumns = @JoinColumn(name = "B_Id", referencedColumnName = "Id"))
        @OrderColumn(name = "idx")
        private List<B> bList;
    }
Caused by: org.hibernate.MappingException: Foreign key (FK76F831D84C8F0D59:D[A_B_Id])) must have same number of columns as the referenced primary key (A_B[A_Id,idx])
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
    at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1714)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1637)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
    ... 45 more

Entity C is

    @Entity
    class C{

    @ManyToMany
        @JoinTable(name = "D", joinColumns = @JoinColumn(name = "C_Id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "A_B_Id", referencedColumnName = "id"))
        private List<A_B> a_bList;
    }