gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:18 25 4
gpt4 key购买 nike

我有一个类似于 @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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com