gpt4 book ai didi

java - 当实体被代理时的代理模式?

转载 作者:行者123 更新时间:2023-12-02 06:17:10 25 4
gpt4 key购买 nike

我正在尝试为以下场景找到最佳解决方案:我有一个必须被代理的实体 A。问题是,当我简单地通过扩展类 A,创建一个抽象代理,将其所有行为委托(delegate)给包装的实体时,我最终会得到从该实体继承的大量未使用的字段。但至少它不会改变持久性的工作方式。

为了不这样做,我创建了一个抽象父类(super class),它只包含抽象方法(公共(public)和 protected 方法,这就是我没有使用接口(interface)的原因),并使其成为实体和所有抽象方法的父类(super class)。代理。这个解决方案看起来是最好的,但是在持久性方面却带来了很多麻烦......

我想依赖应用程序层中的抽象父类(super class)(因为它不区分代理 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 将失败。我知道为什么,问题是怎么处理?

谢谢!

最佳答案

我倾向于创建一个界面,例如 User。然后我将有一个名为 UserBean 的 POJO 和一个名为 UserEntity 的实体,它们都实现该接口(interface)。然后,您可以执行以下两件事之一:在实体中拥有一个接受 bean 的构造函数,以及一个从实体创建 bean 的 createBean 方法。我没有在 bean 类中放置实体的构造函数,因为在我的场景中,我有一个没有 JPA 访问权限的层,因此 bean 无法了解实体的任何信息。

Hibernate 或任何 JPA 提供者都会知道它何时获得真正的 UserEntity,并且如果您不小心向其发送了 UserBean,则会正确地提示。很多时候我什至没有让它们实现相同的接口(interface)。这样我就可以强制我不会意外地跨持久性边界发送 UserEntity 而不是 UserBean。

话又说回来,我可能会误解你的问题,因为“代理”这个词有很多含义。例如,您可以将延迟加载代理视为实体的属性。或者您可能正在谈论远程代理。

关于java - 当实体被代理时的代理模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com