1

Spring 3.2.0、Eclipselink 2.5.0-M9 を使用

persistence.xml に以下が含まれている場合:

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

次に、実行時に emf.getProperties() を介して EntityManagerFactory を調べると、このプロパティは設定されません。

ただし、代わりに Spring entityManagerFactory 構成に入れると:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  ...
  <property name="jpaPropertyMap">
    <map>
      <entry key="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />
    </map>
  </property>
</bean>

次に、emf.getProperties() からプロパティを取得できます。

また、Spring 構成を使用する場合、共有キャッシュが実際には有効になっていないようです。これにより、スプリングコンテナに正しく設定していないと思います。

アイデア?

4

3 に答える 3

1
<shared-cache-mode>

永続ユニットのプロパティではなく、persistence.xml の要素です。" " をプロパティとしてどのように設定するかはわかりませんjavax.persistence.sharedCache.modeが、永続化ユニットのプロパティとして設定され、無視されるだけだと思います。

ただし、デフォルトでは、EclipseLink は共有キャッシュを有効にするため、構成する必要はありません。

キャッシュが使用されていない場合は、Spring のバグhttps://jira.springsource.org/browse/SPR-7753が原因である可能性があります。この場合、 EclipseLinkJpaDialectsetLazyDatabaseTransaction()のオプションを使用して回避策があります。

ENABLE_SELECTIVEを持つエンティティのキ​​ャッシュのみを有効にすることを意味すると思う@Cacheable(true)ので、それはあなたが望むものではないかもしれません。

于 2013-03-21T13:45:23.053 に答える
0

Spring 環境の EclipseLink で共有キャッシュを有効にするこの回避策を見つけました。

@Bean
public EntityManagerFactory entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setDataSource(dataSource());
    factory.setPersistenceUnitName("main");

    final EclipseLinkJpaDialect customDialect = new EclipseLinkJpaDialect() {
        @Override
        public ConnectionHandle getJdbcConnection(EntityManager entityManager, boolean readOnly) throws PersistenceException, SQLException {
            // Hides: return super.getJdbcConnection(entityManager, readOnly);
            // IMPORTANT LINE
            return null;
        }
    };

    // IMPORTANT LINE
    customDialect.setLazyDatabaseTransaction(true);

    EclipseLinkJpaVendorAdapter customAdapter = new EclipseLinkJpaVendorAdapter() {
        @Override
        public JpaDialect getJpaDialect() {
            return customDialect;
        }
    };

    customAdapter.setDatabase(Database.ORACLE);
    factory.setJpaVendorAdapter(customAdapter);

    factory.afterPropertiesSet();
    return factory.getObject();
}
于 2014-10-21T13:39:36.740 に答える