假设我有以下表格:
______________________
| 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)
等等。在询问之前我显然已经累了(尽管无法使其发挥作用)。