1

我有一些 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,因为直到运行时我才知道将创建哪个对象。我怎样才能做到这一点?

4

3 回答 3

2

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

@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 接受了这一点。

于 2008-10-03T20:23:17.797 回答
1

由于您的开关类不是实体,因此不能在实体关系中使用它......不幸的是,您必须将映射超类转换为实体以使其参与关系。

于 2008-10-03T19:17:29.990 回答
0

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

您要么必须使 Switch 成为实体,要么以其他方式更改事物,以便拥有一个作为实体的公共超

于 2008-10-03T19:16:12.660 回答