当前位置: 首页 > 知识库问答 >
问题:

如何在自定义实现中访问Spring数据配置的实体管理器(工厂)

卜弘文
2023-03-14

我正在为Spring Data JPA存储库编写一个自定义实现。所以我有:

我的问题是:在MyEntityRepositoryUmpl的实现中,我需要访问注入SpringData的实体管理器。如何得到它?我可以使用@PersistenceContext自动连接,但问题是这个存储库必须在设置多个持久性单元的应用程序中工作。因此,要告诉Spring我需要哪一个,我必须使用@PersistenceContext(unitName=“myUnit”)。然而,由于我的存储库是在可重用服务层中定义的,因此我不知道高级应用程序层将配置注入我的存储库中的持久化单元的名称是什么。

换句话说,我需要做的是访问Spring数据本身正在使用的实体管理器,但是在(不那么快)查看Spring Data JPA文档之后,我找不到任何关于此的内容。

老实说,< code>Impl类完全不知道Spring数据这一事实,尽管在Spring Data manual中被描述为一个优点,但实际上,每当您需要访问通常由Spring Data本身在您的自定义实现中提供的内容时(我认为几乎总是这样),这就变得很复杂...).

共有3个答案

邬承悦
2023-03-14

Spring Data JPA使用Auto配置类来自动生成entityManagerFactory、dataSource和transactionManager。

如果您想访问entityManager并控制实例化和设置,则需要定义自己的PersistenceConfiguration。下面是使用Java Config的示例代码

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(basePackages = { "com.test.repositories.*" })
    public class PersistenceJpaConfig {

        @Autowired
        JpaVendorAdapter jpaVendorAdapter;

        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                    .setName("testdb")
                    .setType(EmbeddedDatabaseType.HSQL)
                    .build();
        }

        @Bean
        public EntityManager entityManager() {
            return entityManagerFactory().createEntityManager();
        }

        @Bean
        public EntityManagerFactory entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
            lef.setDataSource(dataSource());
            lef.setJpaVendorAdapter(jpaVendorAdapter);
            lef.setPackagesToScan("com.test.domain.*");
            lef.afterPropertiesSet();
            return lef.getObject();
        }

        @Bean
        public PlatformTransactionManager transactionManager() {
            return new JpaTransactionManager(entityManagerFactory());
        }
    }

如果您有多个数据源,请遵循本文。

邓鸿雪
2023-03-14

我能找到的最好的方法是建立一个“约定”:我的存储库声明,他们希望能够使用名为myConventionalPU的持久化单元。然后,应用层将该别名分配给它设置并注入Spring Data的实体管理器工厂,这样我的自定义实现就可以通过使用该别名自动连接来接收正确的EMF。以下是我的应用程序上下文的摘录:

<bean id="myEntityManagerFactory" name="myConventionalPU" 
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  [...]
</bean>

<jpa:repositories base-package="com.example"
  entity-manager-factory-ref="myEntityManagerFactory"
  transaction-manager-ref="transactionManager" />

在我的自定义实现中:

@PersistenceContext(unitName = "myConventionalPU")
private EntityManager em;

我按照此要求打开了 DATAJPA-669。

弓温书
2023-03-14

从版本Spring数据JPA 1.9.2开始,您可以通过Jpa上下文访问实体管理器,请参阅:http://docs.spring.io/spring-data/jpa/docs/1.9.2.RELEASE/reference/html/#jpa.misc.jpa-context。例:

@Component
public class RepositoryUtil
{
    @Autowired
    private JpaContext jpaContext;

    public void deatach(T entity)
    {
        jpaContext.getEntityManagerByManagedType(entity.getClass()).detach(entity);
    }
}

附言:如果您有多个实体管理器候选项用于某个类,则此方法将不起作用,请参阅 JpaContext#getEntityManagerByManagedType 的实现 -

 类似资料:
  • 否则,我将需要把我的大查询放在一个注释中。我更希望有更清楚的东西,而不是一个长的文本。

  • 我有两个数据源。主数据库编写得很好,所以我将它与JPA一起用于多个查询。相反,辅助数据源使用了一个非常难看的数据库,但我只需要执行一个大查询(而不需要其他操作)。通过这个链接,我可以设置辅助数据源(在weblogic上),所以现在我的目标是在辅助数据源上调用本机查询。

  • 我有个问题。我制作了一个使用spring-data的应用程序,并使用spring-data-rest将其公开为REST服务。一切都很顺利,直到我想有一个定制的实现。我用一个附加的方法创建了一个CustomSomethingRepository和一个SomethingRepositoryImpl。Spring data repository接口扩展了CustomSomethingRepository

  • 但问题是这将只锁定一行,而我想在计算总行数时锁定整个表(实体)。 请指教。

  • http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/repositories.html Spring Data的MongoTemplate和MongoRepository有什么区别? 我这样做是因为我需要使用MongoTemplate进行特殊查询。 这里也描述了这个问题,但解决方案似

  • 我正在使用Spring开发一个应用程序。在Access Control Access一节中,我想使用Spring Security Acl(我是Acl的新手)。我想在我的应用程序中实现ACL基于两点: 应用程序应该具有以下五种权限:、、、和。 权限是分层的,当用户具有权限时,它应该能够,或者当用户具有权限时,它应该能够、和等。 更新: 我的应用程序是基于Spring MVC RESTful的。当用