为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 JPA 和 Hibernate 为关联的只读实体获取单个实例?

如何使用 JPA 和 Hibernate 为关联的只读实体获取单个实例?

PIPIONE 2022-07-06 18:25:28
我有这两个实体:@Entity@Immutable@Cacheable@Cache(region = "dosefrequency", usage = CacheConcurrencyStrategy.READ_ONLY)public class DoseFrequency{   .....} @Entitypublic class PrescriptionDrug {     .....    @ManyToOne(optional=false)    @JoinColumn(name="doseFrequency")       public DoseFrequency getDoseFrequency() {        return doseFrequency;     }}DoseFrequency 是一个只读实体,PrescriptionDrug 关联了一个 DoseFreqyency。我想实现每次加载一个或多个 PrescriptionDrug 时不会重复 DoseFrequency 的实例。我知道 DoseFrequency 实例将被缓存在休眠的一级缓存中,但加载是在几个会话中完成的(它是一个 Web 应用程序)。我使用了二级缓存,但该缓存不存储实例,只序列化实体。我在 DoseFrequency 中使用 Tuplizer 得到这个行为,但我不知道是否有任何其他方法可以实现这一点。@Entity@Immutable@Cacheable@Cache(region = "dosefrequency", usage = CacheConcurrencyStrategy.READ_ONLY)@Tuplizer(impl=DoseFrequencyTuplizer.class)public class DoseFrequency {   ....}public class DoseFrequencyTuplizer extends PojoEntityTuplizer {    public DoseFrequencyTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {        super(entityMetamodel, mappedEntity);    }    @Override    protected Instantiator buildInstantiator(EntityMetamodel entityMetamodel, PersistentClass persistentClass) {        return new DoseFrequencyInstantiator(DoseFrequency.class.getName(),entityMetamodel,persistentClass,null);    }    }public class DoseFrequencyInstantiator implements Instantiator {    private final Class targetClass;    protected PojoEntityInstantiator pojoEntityInstantiator;    public DoseFrequencyInstantiator(String targetClassName, EntityMetamodel entityMetamodel,            PersistentClass persistentClass, ReflectionOptimizer.InstantiationOptimizer optimizer) {        try {            this.targetClass = Class.forName(targetClassName);        } catch (ClassNotFoundException e) {            throw new HibernateException(e);        }        pojoEntityInstantiator = new PojoEntityInstantiator(entityMetamodel, persistentClass, optimizer);    }我知道实例将在应用程序的所有线程之间共享,但它们被视为只读,因此不应修改它们。这种方法对吗?
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

您还可以使用 aLoadEventListener来始终为同一个实例提供服务。尽管如此,由于实体是不可变的,因此不需要此功能,因此,即使您有多个副本,它仍然是不可变的。

此外,即使你实现了单例模式,它也只会在每个 JVM 中强制执行,所以我不明白你为什么要实现这个请求。

实体仅被视为单例EntityManager


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信