JPA继承策略JOINED - 子类中的OneToOne关系 - 为什么它不起作用?

时间:2012-09-14 11:18:10

标签: java-ee inheritance jpa sap one-to-one

我有3个表由JPA模型表示。

第一个:

@Entity
@Table(name = "DECISION")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Decision {
    @Id
    private Long id;
}

下一课扩展决策:

@Entity
@Table(name = "SPECIFIC_DECISION")
public class SpecificDecision extends Decision {
    @OneToOne
    @JoinColumn(name = "PERSON_ID")
    private Person person;
}

最后一个是Person,它只是带有人物信息的简单实体类。

现在当我尝试从数据库中选择所有决策时,我得到一个错误,其中包含持久性单元与数据库模式不一致的信息,因为列DECISION.PERSON_ID不存在,而我确实在SPECIFIC_DECISION表中有它并且&# 39;我如何在JPA模型中映射它。

如果在SpecificDecision中没有任何关系,只有简单的NUMBER和VARCHAR字段,那么一切都运行正常。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

看起来我的问题有一个解决方案。默认情况下,JPA在基表中查找连接列。要更改此行为,需要在JoinColumn注释中使用属性“table”:

@Entity
@Table(name = "SPECIFIC_DECISION")
public class SpecificDecision extends Decision {
    @OneToOne
    @JoinColumn(table = "SPECIFIC_DECISION", name = "PERSON_ID")
    private Person person;
}

问题解决了。

答案 1 :(得分:0)

你没有定义DiscriminatorColumn,我不确定是什么导致了你的问题,但根据JPA规范,你总是应该在使用JOINED策略时使用鉴别器,即使有些提供商支持你不这样做。 Link for more info about discriminator