为什么使用@JoinTable时@DiscriminatorColumn被忽略?

2023-12-26

假设我有以下表格:

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

(I know that normalizing the database I could have a table for each person type, but let's stick to the actual structure)

我对不同的进行了子类化PersonsJPA (2.0) 如下:

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

这工作正常,因为我可以查询单个类别并且过滤器是自动的,例如findAll on Plantiff将得到所有的原告所有时代。

现在我正在尝试将它们链接到Lawsuit通过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;

    ...
}

这是事情发生的地方:the @DiscriminatorValue不适用,它似乎被完全绕过@JoinTable.

事实上,Set<Defendant>不仅仅包含被告,但每一个person在这种情况下(每条记录在PERSONS_IN_THE_CASE关系表。例如,如果我有一个Plantiff, a Judge, two 被告和两个Lawyers, 以上Set<Defendant>将包含 6 人,而不是 2)。

我怎样才能使@DiscriminatorValue工作通过@JoinTable捆绑 ?

EDIT:我正在使用 Hibernate 3.6.6.Final,并且(尽管我总是试图避免它)我对特定于供应商的解决方案持开放态度,如@ForceDiscriminator(已弃用),@DiscriminatorOptions(force=true)等等。在询问之前我显然已经累了(尽管无法使其发挥作用)。


没有办法进去standardJPA 共享一个连接表,并在连接表中有一个额外的列作为它所针对的关系的一种区分符。

您可以使用单独的联接表,或者深入了解您的 JPA 提供商支持的供应商扩展;我知道 DataNucleus JPA 确实允许您需要的东西(请参阅this doc http://www.datanucleus.org/products/accessplatform_4_2/jdo/orm/one_to_many_collection.html#shared_join,对于 JDO,但它也适用于 JPA)并且期望其他提供商可能有某种方法来做到这一点 - 但随后您使您的应用程序在 JPA 提供商方面不可移植。

或者重新设计关系(如果您的项目可以选择)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用@JoinTable时@DiscriminatorColumn被忽略? 的相关文章

随机推荐