Mat*_*teo 12 java hibernate jpa
我有一个类似于@ManyToMany的问题,没有连接表(遗留数据库),还有一个问题.
我有两个表A和B
A使用多列主键(ID和ID2)B使用多列主键(ID和ID3)行中的一行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.这两个类A和B被简化(匿名)的例子.
您可以创建一个充当连接表的视图:
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。
| 归档时间: |
|
| 查看次数: |
2284 次 |
| 最近记录: |