使用多对多关系映射只读数据库而不使用连接表

Mat*_*teo 12 java hibernate jpa

我有一个类似于@ManyToMany的问题,没有连接表(遗留数据库),还有一个问题.

我有两个表AB

  • A使用多列主键(IDID2)
  • B使用多列主键(IDID3)

行中的一行A可以引用B(B.ID = A.ID)中的多行,而行中B的几行可以引用A.

编辑:数据库是一个只读的遗留数据库,我无法更改.我不需要映射与JPA的关系(我可以在我的程序逻辑中使用额外的选择来实现它)但它会很好.

它基本上是没有连接表的多对多关系.因为,对于链接的问题,我只需阅读表格,我尝试在两个类中使用两个一对多关系.

我遇到的另一个问题是,ID用于连接的两个都不是主键.

我有以下课程:

@Entity
@Table( name = "A" )
@IdClass( PrimaryKeysA.class )
public class A {

    @Id
    @Column( name = "ID", insertable = false, updatable = false, columnDefinition = "char" )
    private String id;

    @Id
    @Column( name = "ID2", insertable = false, updatable = false )
    private int id2;

    @OneToMany( cascade = CascadeType.ALL )
    @JoinColumn( name = "ID", columnDefinition = "char", referencedColumnName = "ID" )
    private Set< B > setOfBs;

}

@Entity
@Table( name = "B" )
@IdClass( PrimaryKeysB.class )
public class B {

    @Id
    @Column( name = "ID", insertable = false, updatable = false, columnDefinition = "char" )
    private String id;

    @Id
    @Column( name = "ID3", insertable = false, updatable = false )
    private int id3;

    @OneToMany( cascade = CascadeType.ALL )
    @JoinColumn( name = "ID", columnDefinition = "char", referencedColumnName = "ID" )
    private Set< A > setOfAs;

}
Run Code Online (Sandbox Code Playgroud)

Hibernate生成以下错误:

Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
Run Code Online (Sandbox Code Playgroud)

我真的没有收到消息:B.id引用A(A.id)中的单个属性.

编辑:按要求:

public class PrimaryKeysA implements Serializable {

private static final long   serialVersionUID    = 1L;

private int    id1;
private int    id2;

    // getters/setters/equals/hashcode

}
Run Code Online (Sandbox Code Playgroud)

PrimaryKeysB与id3类似,而不是id2.这两个类AB被简化(匿名)的例子.

Gee*_*nte 4

您可以创建一个充当连接表的视图:

CREATE VIEW AJOINB AS
SELECT A.ID as AID, A.ID2 as AID2, B.ID as BID, B.ID3 as BID3
FROM A JOIN B ON A.ID = B.ID
Run Code Online (Sandbox Code Playgroud)

然后将其在 JPA 中映射为 ManyToMany,并使用 AJOINB 作为联接表。

如果 A.ID2 和 B.ID3 本身是唯一的,那么您甚至不需要在 JPA beans 中映射 A.ID 和 B.ID。