好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JPA之EntityManager踩坑及解决:更改PersistenceContext

JPA EntityManager踩坑之更改PersistenceContext

一、原因

项目中配置两个Spring JPA的数据源,使用EntityManager的时候默认是选择第一个,导致查询不到第二个数据源的数据。

二、Spring JPA多数据源怎么使用EntityManager

1. Spring JPA多数据源的配置请查看此文章: SpringData JPA基本/高级/多数据源使用

2. 引入EntityManager:

?

1

2

@PersistenceContext (unitName = "primaryPersistenceUnit" )

private EntityManager entityManager;

@PersistenceContext中的unitName指的是使用哪一个数据源的persistenceUnit,persistenceUnit是在配置数据源的时候配置的,每一个数据源的persistenceUnit都是不一样的,这样就可以使用不同的数据源来查询数据了。

配置persistenceUnit:

?

1

2

3

4

5

6

7

8

9

10

@Bean (name = "entityManagerFactoryPrimary" )

@Primary

public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {

    return builder

            .dataSource(primaryDataSource)

            .properties(vendorProperties)

            .packages( "com.neo.model" ) //设置实体类所在位置

            .persistenceUnit( "primaryPersistenceUnit" )

            .build();

}

三、使用EntityManager

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

String SQL = "select id ,code,name,'desc' from drgo_cd10_dx_code where name like ('%" +content.trim()+ "%') "

logger.info( "search getProductOwnerId SQL:" +SQL);

Query query = entityManager.createNativeQuery(SQL);

List<Object[]> dbList = query.getResultList();

List<ICD10CodeData> resultList = new ArrayList<ICD10CodeData>();

if (dbList!= null && dbList.size()> 0 ){

      for ( int i = 0 ;i<dbList.size();i++){

      Object[] o = dbList.get(i);

      String id = o[ 0 ]== null ? "" :o[ 0 ].toString();

      String code = o[ 1 ]== null ? "" :o[ 1 ].toString();

      String name = o[ 0 ]== null ? "" :o[ 2 ].toString();

      String desc = o[ 1 ]== null ? "" :o[ 3 ].toString();

      ICD10CodeData tempCode = new ICD10CodeData(Long.parseLong(id), code, name, desc);

       resultList.add(tempCode);

      }

  }

@PersistenceContext(unitName = "entityManagerFactory")

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

@Configuration

@EnableTransactionManagement (mode = AdviceMode.ASPECTJ, proxyTargetClass = true )

@ComponentScan ({cn测试数据.appName.manager,cn测试数据.appName.dao,cn测试数据.appName.dao.jpa})

public class AppConfig extends AbstractManager

{

      @Bean (name = "entityManagerFactory" )

     public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()

     {

         LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

         factoryBean.setDataSource(dataSource( null ));

         factoryBean.setPackagesToScan( new String[] { "cn测试数据." + AppConfig.APP_NAME + ".entity" });

         HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

         vendorAdapter.setDatabasePlatform(hibernateDialect);

         if (logger.isDebugEnabled())

         {

             // vendorAdapter.setShowSql(true);

             // vendorAdapter.setGenerateDdl(true);

         }

         //vendorAdapter.setGenerateDdl(true);

         factoryBean.setJpaVendorAdapter(vendorAdapter);

         // factoryBean.setJpaProperties(this.additionlProperties());

         return factoryBean;

     }

}

public abstract class MyBaseDao<E extends BaseEntity> extends BaseDaoJpa<E>

{

     protected MyBaseDao()

     {    }

 

   //unitName与LocalContainerEntityManagerFactoryBean类的容器对象的名称一致

     @PersistenceContext (unitName = "entityManagerFactory" )

     public void setJpaEntityManager(EntityManager entityManager)

     {

         super .setEntityManager(entityManager);

     }

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/jim_LoveQ/article/details/107494356

查看更多关于JPA之EntityManager踩坑及解决:更改PersistenceContext的详细内容...

  阅读:30次