gpt4 book ai didi

java - 为什么在使用@JoinTable 时会忽略@DiscriminatorColumn?

转载 作者:行者123 更新时间:2023-11-30 08:04:10 24 4
gpt4 key购买 nike

假设我有以下表格:

 ______________________
| LAWSUIT |
|______________________|
| ID |
| TITLE |
|______________________|
\
\
\
______________________
| PERSONS_IN_THE_CASE |
|______________________|
| ID_LAWSUIT |
| ID_PERSON |
|______________________|
/
/
/
______________________
| PERSON |
|______________________|
| ID |
| NAME |
| TYPE | TYPE values = "Plantiff, Defendant, Lawyer, Judge, ..."
|______________________|

(我知道规范化数据库我可以为每个人类型创建一个表,但让我们坚持实际结构)

我用 JPA (2.0) 将不同的 Persons 子类化如下:

@Entity
@Table(name="PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE")
public abstract class Person {
@Entity
@DiscriminatorValue("Plantiff")
public class Plantiff extends Person {
@Entity
@DiscriminatorValue("Defendant")
public class Defendant extends Person {
@Entity
@DiscriminatorValue("Lawyer")
public class Lawyer extends Person {

这工作正常,因为我可以查询单个类别并且过滤器是自动的,例如 findAllPlantiff 上将获得所有时间的所有 Plantiff

现在我正试图通过 PERSONS_IN_THE_CASE 将他们与诉讼联系起来@加入表:

@Entity
@Table(name="LAWSUIT")
public class Lawsuit {

@Id
Long id;

String title;

@OneToMany
@JoinTable(name="PERSONS_IN_THE_CASE",
joinColumns=@JoinColumn(name="ID_LAWSUIT", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="ID_PERSON", referencedColumnName="ID"))
Plantiff plantiff;


@ManyToMany
@JoinTable(name="PERSONS_IN_THE_CASE",
joinColumns=@JoinColumn(name="ID_LAWSUIT", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="ID_PERSON", referencedColumnName="ID"))
Set<Defendant> defendants;

...
}

这里是问题所在:@DiscriminatorValue没有应用,它似乎被 @JoinTable 完全绕过了.

事实上,Set<Defendant>不仅包含被告,还包含案件中的每个(PERSONS_IN_THE_CASE 关系表中的每条记录。例如,如果我有一个 < em>原告、一名法官、两名被告和两名律师,以上Set<Defendant>将包含6人而不是2人).

如何制作 @DiscriminatorValue通过 @JoinTable 工作绑定(bind) ?

编辑:我正在使用 Hibernate 3.6.6.Final,并且(尽管我总是尽量避免使用它)我对供应商特定的解决方案持开放态度,喜欢 @ForceDiscriminator (已弃用), @DiscriminatorOptions(force=true)等等。在询问之前我已经很明显地尝试过了(尽管无法让它发挥作用)。

最佳答案

标准 JPA 中没有办法共享一个连接表,并且在连接表中有一个额外的列作为一种区分器来区分它是用于哪种关系。

您可以使用单独的连接表,或深入研究您的 JPA 提供程序支持的供应商扩展;我知道 DataNucleus JPA 确实允许像你需要的东西(参见 this doc ,对于 JDO,但它也适用于 JPA)并且希望其他提供商可能有某种方式来做到这一点 - 但你然后让你的应用程序非 -就 JPA 提供程序而言是可移植的。

或者重新设计关系,如果这是您项目的一个选项

关于java - 为什么在使用@JoinTable 时会忽略@DiscriminatorColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35872402/

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