JPA和继承

时间:2020-03-06 15:05:18  来源:igfitidea点击:

我有一些JPA实体,它们彼此继承,并使用鉴别器确定要创建的类(到目前为止尚未试用)。

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {}

@MappedSuperclass
public abstract class Switch implements ISwitch {}

@Entity(name="switch_accounts")
public class SwitchAccounts implements Serializable {
    @ManyToOne()
    @JoinColumn(name="switch_id")
    DmsSwitch _switch;
}

因此,在SwitchAccounts类中,我想使用基类Switch,因为在运行时之前我不知道将创建哪个对象。我怎样才能做到这一点?

解决方案

我认为我们无法使用当前的对象模型。 Switch类不是实体,因此不能在关系中使用。 @MappedSuperclass注释是为了方便起见,而不是为了编写多态实体。没有与Switch类关联的数据库表。

我们或者必须使Switch成为一个实体,或者以其他方式进行更改,以使我们拥有一个作为实体的公共超类。

由于切换类不是实体,因此不能在实体关系中使用...不幸的是,我们必须将mappingsuperclass转换为实体,以使其包含在关系中。

作为前面的评论者,我同意类模型应该有所不同。我认为以下内容就足够了:

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="400")
public class Switch implements ISwitch {
  // Implementation details
}

@Entity(name="switches")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {
  // implementation
}

@Entity(name="switches")
@DiscriminatorValue(value="600")
public class SomeOtherSwitch extends Switch implements Serializable {
  // implementation
}

我们可以通过使构造函数受保护来直接阻止Switch的实例化。我相信Hibernate接受这一点。