【发布时间】:2014-01-25 14:29:58
【问题描述】:
我正在尝试为以下情况找到最佳解决方案:我有一个必须代理的实体 A。问题是,当我只是通过扩展类 A 来实现时,创建一个抽象代理,将其所有行为委托给包装的实体,我最终会从该实体继承大量未使用的字段。但至少它不会改变持久性的工作方式。
为了不这样做,我创建了一个抽象超类,它只包含抽象方法(公共的和受保护的,这就是我没有使用接口的原因)并使它成为实体和所有的超类代理。这个解决方案似乎是最好的,但是在持久性方面会带来很多麻烦......
我想依赖我的应用层中的抽象超类(因为它不区分代理 A 和非代理 A)但是 Hibernate 不会让我 - 实体实例不能与抽象类,因为持久性上下文不知道它。当然,我可以降低实体类,但这违背了目的......
有没有办法让 Hibernate 自己向下转换实体?我的意思是我可以在任何地方使用抽象类,但 Hibernate 会知道它实际上是实体类...
public abstract class AbstractA {
public abstract void doSomethingOnA();
}
@Entity
public class EntityA extends AbstractA {
@Id
private Long id;
@Column(name="column_in_a")
private SomethingA somethingA;
@Override
public void doSomethingOnA() {
somethingA.doSomething();
}
}
public class ProxiedA extends AbstractA {
private AbstractA wrappee;
@Override
public void doSomethingOnA() {
doSomethingFirst();
wrappee.doSomethingOnA();
}
}
问题是在持久性方面我也想使用 AbstractA 而不是 EntityA。问题是当另一个实体声明一个 AbstractA 类型的字段时,Hibernate 将失败。我知道为什么,问题是如何处理?
谢谢!
【问题讨论】: