【问题标题】:Call transactional method Play Java JPA Hibernate调用事务方法 Play Java JPA Hibernate
【发布时间】:2016-11-28 07:56:08
【问题描述】:

我有 2 个数据库,一个是 mysql,另一个是 postgree。 我试图从 mysql 事务方法中获取 postgree 数据。

@Transactional(value = "pg")
    public List<String> getSubordinate(){
        Query q1 = JPA.em().createNativeQuery("select vrs.subordinate_number, vrs.superior_number\n" +
                "from view_reporting_structure vrs\n" +
                "where vrs.superior_number = :personel_number");
        q1.setParameter("personel_number","524261");
        List<String> me = q1.getResultList();
        return me;
    }
}

从另一个方法

@Transactional
public Result getOpenRequestList(){
    Subordinate subordinate = new Subordinate();
    List<String> subordinateData = subordinate.getSubordinate();
    ....
}

我有错误

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'db_hcm.view_reporting_structure' doesn't exist

所以我的 Postgre 方法被识别为 mySQL 事务,这是 mySQL 数据库中不存在的视图。如何通过一种方法从不同的存在单元获取数据?

【问题讨论】:

  • 不知道你在说什么。 EntityManagerFactory 用于单个数据库。所以决定它是什么...... MySQL或PostgreSQL

标签: java hibernate jpa playframework playframework-2.5


【解决方案1】:

我从来没有这样做过(不同的数据库),但我猜以下可能会起作用。

例如,您在 application.conf 中有以下数据源定义:

# MySql
db.mysql.driver=com.mysql.jdbc.Driver
... the rest of setting for db.mysql

# H2
db.postgre.driver=org.postgresql.Driver
... the rest of setting for db.postgre

不使用@Transactional 注释,而是显式管理事务并使用JPA withTransaction API:

private static final String MYSQL_DB = "mysql";
private static final String POSTGRE_DB = "postgre";

public List<String> getSubordinate() {
    JPA.withTransaction(MYSQL_DB, true/* this is read-only flag*/,
    () -> {
        Query q1 = JPA.em().createNativeQuery("select vrs.subordinate_number, vrs.superior_number\n" +
            "from view_reporting_structure vrs\n" +
            "where vrs.superior_number = :personel_number");
        q1.setParameter("personel_number","524261");
        List<String> me = q1.getResultList();
        return me;
    }
}

public Result getOpenRequestList(){
    JPA.withTransaction(POSTGRE_DB, true/* this is read-only flag*/,
    () -> {
        Subordinate subordinate = new Subordinate();
        List<String> subordinateData = subordinate.getSubordinate();
        ....
    }
}

注意:我更喜欢总是使用 withTransaction,因为它可以更好地控制不愉快的流程。您应该使用 try-catch 来包装调用。如果 JPA 在提交时抛出运行时异常,您可以进行适当的错误处理。如果使用@Transactional 注释,则在控制器完成后提交,您无法处理错误。

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 2021-03-10
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多