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

目录
  • JPAEntityManager踩坑之更改PersistenceContext
    • 一、原因
    • 二、SpringJPA多数据源怎么使用EntityManager
    • 三、使用EntityManager
  • @PersistenceContext(unitName="entityManagerFactory")

JPA EntityManager踩坑之更改PersistenceContext

一、原因

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

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

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

2. 引入EntityManager:

@PersistenceContext(unitName = "primaryPersistenceUnit")
private EntityManager entityManager;

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

配置persistenceUnit:

@Bean(name = "entityManagerFactoryPrimary")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(primaryDataSource)
            .properties(vendorProperties)
            .packages("com.neo.model") //设置实体类所在位置
            .persistenceUnit("primaryPersistenceUnit")
            .build();
}

三、使用EntityManager

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")

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@ComponentScan({cn.com.appName.manager,cn.com.appName.dao,cn.com.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.com." + 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);
    }
}

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

(0)

相关推荐

  • JPA如何使用entityManager执行SQL并指定返回类型

    下面是代码 Query query = entityManager.createNativeQuery(yourSql); //指定返回类型 query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(yourClass)); //获取返回集合 List resultList = query.getResultList(); 注:此方法不支持枚举类的自动转型,需要在entity中改一下枚举类的set方法.

  • jpa EntityManager 复杂查询实例

    目录 jpa EntityManager复杂查询 概念 1. 注入entitymanager 2. 建立连接,执行查询操作 拓展 基于EntityManager的使用 1.最基础的查询 2.spring data jpa的toPredicate方法 jpa EntityManager复杂查询 概念 EntityManager:EntityManager是JPA中用于增删改查的接口,它的作用相当于一座桥梁,连接内存中的java对象和数据库的数据存储.可以用getCriteriaBuilder()的

  • Spring Data JPA实现动态查询的两种方法

    前言 一般在写业务接口的过程中,很有可能需要实现可以动态组合各种查询条件的接口.如果我们根据一种查询条件组合一个方法的做法来写,那么将会有大量方法存在,繁琐,维护起来相当困难.想要实现动态查询,其实就是要实现拼接SQL语句.无论实现如何复杂,基本都是包括select的字段,from或者join的表,where或者having的条件.在Spring Data JPA有两种方法可以实现查询条件的动态查询,两种方法都用到了Criteria API. Criteria API 这套API可用于构建对数据

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

    目录 JPAEntityManager踩坑之更改PersistenceContext 一.原因 二.SpringJPA多数据源怎么使用EntityManager 三.使用EntityManager @PersistenceContext(unitName="entityManagerFactory") JPA EntityManager踩坑之更改PersistenceContext 一.原因 项目中配置两个Spring JPA的数据源,使用EntityManager的时候默认是选择第一

  • 基于IOS端微信分享失效的踩坑及解决方法

    最近的一个公众号是基于vue的spa应用,在接入微信分享和微信语音的时候出现了:在Android上一切正常,但是在ios端调用wx.config的时候总是失败,去翻了官方文档也并没有找到解决方案,最后在测试中发现是因为初始化的时候传入的URL的问题.具体过程如下: 微信config接口配置,官方文档如下: 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支

  • spring-cloud-gateway启动踩坑及解决

    目录 spring-cloud-gateway启动踩坑 1.webflux与mvc不兼容 2.webflux使用netty作为容器 3.后来实验了下 很坑得spring cloud gateway 异常 spring-cloud-gateway启动踩坑 本人使用的版本是2.1.2,以下只记录几个小问题,但确实实实在在的把个人恶心的要死要活的找不到办法,几经挣扎,最终解决. 更可恨的是开发的过程中,没有出现异常,后来由于项目组其它人加了依赖,不知不觉对项目的兼容造成了英雄,真的是被撞的头破血流,才

  • Spring数据库连接池url参数踩坑及解决

    目录 Spring数据库连接池url参数踩坑 遇到的问题 报错情况 解决 修改数据库连接池的url后,还是连接原先的url 问题 例如 Spring数据库连接池url参数踩坑 遇到的问题 报错情况 解决 & ' 字符在xml需要转义为 ' & ' 修改数据库连接池的url后,还是连接原先的url 问题 当修改连接池url之后,访问的还是原来的数据库. 例如 原来: url=jdbc:mysql://192.168.250.227:3306/myshop?characterEncoding=

  • Spring data jpa @Query update的坑及解决

    目录 Springdatajpa@Queryupdate的坑 可以参考这个例子 Springdatajpa的update操作 1.调用保存实体的方法 2.@Query注解,自己写JPQL语句 Spring data jpa @Query update的坑 jpa默认只有save(Entity)方法,如果数据库中没有记录就新增,如果数据库中有记录就更新记录. 如果要手动添加update(Entity)方法, 可以参考这个例子  @Modifying  @Query(value = "UPDATE

  • nuxt使用vuex存储及获取用户信息踩坑的解决

    目录 一.背景 二.具体使用方法以及遇到的问题 三.解决办法 一.背景 按公司要求做一个电商网站,考虑到seo,所以用的是nuxt进行开发. 登录之后记录用户信息(user)使用cookie+vuex模式. 二.具体使用方法以及遇到的问题 1.无法解码导致无法转化为对象且不支持中文: 使用nuxt的nuxtServerInit在在服务端的cookie里获取用户信息,但是user在存储时使用js-cookie,客户端已对数据进行编码且可能包含中文,在使用JSON.parse进行string转化为对

  • springboot整合freemarker的踩坑及解决

    目录 springboot整合freemarker踩坑 报错 问题原因 解决方法 springboot freemarker基础配置及使用 1.基础配置 2.基础使用 springboot整合freemarker踩坑 报错 2021-04-23 02:01:18.148 ERROR 9484 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatc

  • vuepress打包部署踩坑及解决

    目录 vuepress打包部署踩坑记录 vuepress打包报错:error Error rendering /: 问题 方案1 方案2 vuepress打包部署踩坑记录 官网教程 官网给了多种部署方案,这里我才用的是部署到github上 在你的项目中,创建一个如下的 deploy.sh 文件(请自行判断去掉高亮行的注释): #!/usr/bin/env sh # 确保脚本抛出遇到的错误 set -e # 生成静态文件 npm run docs:build # 进入生成的文件夹 cd docs/

  • 记VUE3+TS获取组件类型的方法踩坑及解决

    目录 VUE3+TS获取组件类型的方法踩坑 遇到的坑 问题原因 解决办法 VUE3+TS获取组件ref实例 如何获取组件的类型呢? 总结 VUE3+TS获取组件类型的方法踩坑 获取组件类型的方法 const AccountRef = ref<InstanceType<typeof LoginAccount>>() 遇到的坑 typeof LoginAccount一直报红线提示错误 LoginAction: () => vo...' provides no match for

  • Vue3+Tsx给路由加切换动画时的踩坑及解决

    目录 项目场景 样式文件 步骤 最终代码 总结 项目场景 用最新的技术栈Vue+Tsx给后台管理系统路由加动画时,语法上与模板语法有些许不同,记录下自己的踩坑记录 样式文件 新建文件transition.scss,这里用的是若依框架人家写好的样式,写好之后在全局引入该样式文件 // global transition css /* fade */ .fade-enter-active, .fade-leave-active { transition: opacity 0.28s; } .fade

随机推荐