java - 在没有连接表的情况下映射具有多对多关系的只读数据库

标签 java hibernate jpa

我有一个类似于 @ManyToMany without join table (legacy database) 的问题还有一个问题。

我有两个表 AB

  • A 具有多列主键(IDID2)
  • B 具有多列主键(IDID3)

A中的一行可以引用B中的几行(B.ID = A.ID)和中的一行B 可以被 A 中的多行引用。

编辑:该数据库是我无法更改的只读遗留数据库。我不需要映射与 JPA 的关系(我可以通过额外的选择在我的程序逻辑中做到这一点)但它会很好。

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

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

我有以下类(class):

@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;

}

Hibernate 生成以下错误:

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

我没有真正理解消息: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

}

PrimaryKeysB 类似于 id3 而不是 id2。 AB 类都是简化(匿名)示例。

最佳答案

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

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

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

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

关于java - 在没有连接表的情况下映射具有多对多关系的只读数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616569/

相关文章:

java - 从 Jaxb 1 更新到 Jaxb 2

java - Hibernate只读实体表示通过删除数据库快照来节省内存

mysql - 如何使用 Hibernate 和 log4j 只记录插入和更新?

java - 如何模拟EntityManager?

java - 从文本文件中扫描、分割和赋值

java - Spring 连接的 EhCache 磁盘存储在多线程应用程序中创建冲突

java - 导入 git repo 后在 Eclipse 中的运行配置中找不到项目

database - Hibernate c3p0 连接池不会超时空闲连接

spring - JPA 存储库适用于 IDEA 和生产环境,但不适用于 gradle

java - 如何在 packagesToScan 属性中提及 persistenceUnitName