gpt4 book ai didi

java - Jpa - 根据列类型连接不同的表

转载 作者:行者123 更新时间:2023-12-02 06:16:28 25 4
gpt4 key购买 nike

我有一个问题,我不确定 jpa 是否可行

如果我有表A

public class A {
Long id;
Long type;
Details details; // can this connect to B or c depends on type?
}

表B和C是两个不同的详细信息表。 (不确定有什么共同点)我可以将 B 或 C 连接到 A 吗?取决于 A.type 吗?

谢谢

阿隆

编辑:让我尝试更准确

我有实体

 @Entity     
@Table(name = "tbl_A")
public class A implements Serializable {

/**
*
*/
private static final long serialVersionUID = 1L;

@Id
private Long id; // seems like spring's jpa has issue hanlde "_"

/*
*can i achive some thinglike
* if detailsTableType== 1 use Details as B table
*/


@OneToOne(mappedBy = "details", cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private B details;

/*
*can i achive some thinglike
* if detailsTableType== 2 use Details as C table
*/

@OneToOne(mappedBy = "details", cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private C details; //Details

/*
* this field set the from where the join should be
*/

private Long detailsTableType;

}

注意 B、C 不一定有任何共同点

编辑2:

一种可能的解决方案是使用 getter 进行某种破解。意思是: 映射 A 中所有可能的连接(将它们标记为惰性连接)并创建一个 getter,它会根据类型知道应该使用哪个连接。

最佳答案

我猜您想向 A 实例添加一些详细信息,并从 A 类继承 B 和 C 类。我建议您阅读有关继承和鉴别器值/列的文档。

关于 hibernate 的文档你会看到如何- 使用继承的概念和TABLE_PER_CLASS策略- 并描述鉴别器列(您的类型列)

编辑:但我建议您使用其他策略,例如 SINGLE_TABLE_PER_CLASS。请注意,JPA 提供程序不必支持 TABLE_PER_CLASS 策略,而且这种特定策略会对性能产生影响。

*第二次编辑:* 好的:我建议您对 B 类和 C 类使用多态性,因为它们使用一些共同点 => 与基类 A 的链接!

你可以:

Class A
* Member list of DetailsItf

DetailItf (interface)
|
AbstractDetail (SINGLE_TABLE_PER_CLASS strategy with discriminator colum ou TABLE_PER_CLASS) implements DetailItf
|
|-B inherits from Details
|-C inherits from Details

然后你必须在你的 A 基类中使用 AbstractDetail 类,例如:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany( targetEntity=foo.pck.AbstractDetail.class )
private List<DetailsItf> details = new ArrayList<DetailItf>();

在使用时,您应该制作一个

B myB = new B();
// saving myB entity
A myA = new A();
myA.addDetails(myB);
// saving myA

您还应该根据 TYPE() JPQL 特定关键字或在 jpql 中使用 FROM CLASS 进行特定查询,但您必须创建概念证明并验证性能。

关于java - Jpa - 根据列类型连接不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408218/

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