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

我有这两个实体:


@Entity

@Immutable

@Cacheable

@Cache(region = "dosefrequency", usage = CacheConcurrencyStrategy.READ_ONLY)

public class DoseFrequency{

   .....


@Entity

public 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);


    }



我知道实例将在应用程序的所有线程之间共享,但它们被视为只读,因此不应修改它们。


这种方法对吗?


PIPIONE
浏览 77回答 1
1回答

慕的地10843

您还可以使用 aLoadEventListener来始终为同一个实例提供服务。尽管如此,由于实体是不可变的,因此不需要此功能,因此,即使您有多个副本,它仍然是不可变的。此外,即使你实现了单例模式,它也只会在每个 JVM 中强制执行,所以我不明白你为什么要实现这个请求。实体仅被视为单例EntityManager。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java