我有这两个实体:@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
。
添加回答
举报
0/150
提交
取消