如何在 JPA 2.0 项目中加载 Hibernate 'xxx.hbm.cfg' 文件?

2024-01-02

我刚刚启动了一个 Spring Roo 应用程序,使用 Hibernate 作为 JPA2.0 提供程序。我使用罐​​子的方式如下:

hibernate-core-3.6.4.Final.jar

hibernate-commons-annotations-3.2.0.jar

hibernate-entitymanager-3.6.4.Final.jar

hibernate-jpa-2.0-api-1.0.0.Final.jar

hibernate-validator-4.1.0.Final.jar

我正在使用注释来处理应用程序的事务方面,没有问题。

但是应用程序的其他部分需要非常复杂的查询,我之前在 Hibernate 中处理它的方式是创建一个映射文件,例如 (mybigdwquery.hbm.xml),我将在其中指定我的查询及其映射对象,波乔。不是@Entity。这很好用。

然而,通过我之前发布的另一个问题,我发现在 JPA 2.0 中你不能将查询映射到 POJO,所有内容都必须映射到 @Entity(数据库表不是?)。

所以我的问题如下:

有什么办法可以让我拥有我的'mybigdwquery.hbm.xml'文件作为 hbm.xml 加载到我的 persistence.xml 中,以便我可以调用命名查询?

我的 persistence.xml 如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>             
        <properties>
            <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> -->
            <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->            
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>                                   
        </properties>
    </persistence-unit>    
</persistence>

我需要加载的文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="edu.kdc.visioncards.pojo">

    <class name="AttendanceBreakDown">
        <cache usage="read-only" />
        <id name="studentName"/>
        <property name="pupilId"></property>
        <property name="enrollmentStatus"></property>
        <property name="attendanceLevel"></property>
        <property name="attendanceDays"></property>
        <property name="authorizedAbsences"></property>
        <property name="unexcusedAbsences"></property>
        <property name="excusedAbsences"></property>
        <property name="tardies"></property>
        <property name="attendancePct"></property>
    </class>

    <sql-query name="attendanceDetailsBySchoolAndGradingPeriod">
        <return alias="attSchGr" class="edu.kdc.visioncards.pojo.AttendanceBreakDown">
         <return-property name="studentName" column="student_name"/>
         <return-property name="pupilId" column="student_id"/>
         <return-property name="enrollmentStatus" column="enrollment_status"/>
         <return-property name="attendanceLevel" column="attendance_Level"/>
         <return-property name="attendanceDays" column="attendance_days"/>
         <return-property name="authorizedAbsences" column="auth_abs"/>
         <return-property name="unexcusedAbsences" column="unx_abs"/>
         <return-property name="excusedAbsences" column="x_abs"/>
         <return-property name="tardies" column="tardies"/>
         <return-property name="attendancePct" column="att_pct"/>
         </return>
          select
                a.student_name
               ,a.student_id
               ,a.enrollment_status
               ,a.attendance_days
               ,a.Attendance_Level
               ,b.authorized_absences as auth_abs
               ,nvl(c.unx_abs,0) as unx_abs
               ,nvl(d.x_abs, 0) as x_abs
               ,nvl(e.tardies, 0) as tardies
               ,a.att_pct
          from
              (select
                   s.student_name
                  ,s.student_id
                  ,s.student_activity_indicator as enrollment_status
                  ,sum(fas.attendance_days) as attendance_days
                  ,round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) as att_pct
                  ,case when(round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) &lt;= 87)
                                then 'Intervene'
                                when(round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) >87 and
                                     round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) &lt;= 89.9)
                                then 'Concern'
                                when(round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) >=90 and
                                     round((sum(fas.attendance_value) / sum(fas.attendance_days))* 100,2) &lt;= 95)
                                then 'Baseline'
                                else 'Is Clean'
                           end AS Attendance_Level
                  from K12INTEL_DW.ftbl_attendance_stumonabssum fas
                   inner join k12intel_dw.dtbl_students s
                       on fas.student_key = s.student_key
                  inner join K12INTEL_DW.dtbl_schools ds
                      on fas.school_key = ds.school_key
                  inner join k12intel_dw.dtbl_school_dates dsd
                      on fas.school_dates_key = dsd.school_dates_key
                  where dsd.rolling_local_school_yr_number = 0
                  and ds.school_code = ?
                  and s.student_activity_indicator = 'Active'
                  and fas.LOCAL_GRADING_PERIOD = ?
                  and s.student_current_grade_level = ?
                  group by s.student_id, s.student_name, s.student_activity_indicator
                  having (sum(fas.attendance_value) / sum(fas.attendance_days)) &lt; .95
               ) a
          inner join
                  (select t.student_id
                   ,sum(t.auth_abs) as authorized_absences
                  from(
                      select dstud.student_id
                             ,case when(fas.excused_authorized) in ('NA', 'No')
                             then 0 else 1
                             end as auth_abs
                      from K12INTEL_DW.ftbl_attendance_stumonabssum fas
                      inner join K12INTEL_DW.dtbl_schools ds
                          on fas.school_key = ds.school_key
                      inner join k12intel_dw.dtbl_students dstud
                          on dstud.student_key = fas.student_key
                      inner join k12intel_dw.dtbl_school_dates dsd
                          on dsd.school_dates_key = fas.school_dates_key
                      where dsd.rolling_local_school_yr_number = 0
                      and dstud.student_activity_indicator = 'Active'
                      and ds.school_code = ?
                      and fas.LOCAL_GRADING_PERIOD = ?
                      and dstud.student_current_grade_level = ?
                   ) t
                  group by t.student_id)b
          on b.student_id = a.student_id
          left outer join
                      ( select dstud.student_id,
                               count(fas.excused_absence) as unx_abs
                          from K12INTEL_DW.ftbl_attendance_stumonabssum fas
                          inner join K12INTEL_DW.dtbl_schools ds
                              on fas.school_key = ds.school_key
                          inner join k12intel_dw.dtbl_students dstud
                              on dstud.student_key = fas.student_key
                          inner join k12intel_dw.dtbl_school_dates dsd
                              on dsd.school_dates_key = fas.school_dates_key
                          where dsd.rolling_local_school_yr_number = 0
                          and dstud.student_activity_indicator = 'Active'
                          and fas.excused_absence = 'Un-excused absence'
                          and ds.school_code = ?
                          and fas.LOCAL_GRADING_PERIOD = ?
                          and dstud.student_current_grade_level = ?
                          group by dstud.student_id
                       ) c
          on c.student_id = a.student_id
          left outer join
              (select dstud.student_id, count(fas.excused_absence) as x_abs
                  from K12INTEL_DW.ftbl_attendance_stumonabssum fas
                  inner join K12INTEL_DW.dtbl_schools ds
                      on fas.school_key = ds.school_key
                  inner join k12intel_dw.dtbl_students dstud
                      on dstud.student_key = fas.student_key
                  inner join k12intel_dw.dtbl_school_dates dsd
                      on dsd.school_dates_key = fas.school_dates_key
                  where dsd.rolling_local_school_yr_number = 0
                  and dstud.student_activity_indicator = 'Active'
                  and fas.excused_absence = 'Excused absence'
                  and ds.school_code = ?
                  and fas.LOCAL_GRADING_PERIOD = ?
                  and dstud.student_current_grade_level = ?
                  group by dstud.student_id) d
          on d.student_id = a.student_id
          left outer join
              (select s.student_id
                     ,sum(a.attendance_value) tardies
                from k12intel_dw.ftbl_attendance a
                inner join k12intel_dw.dtbl_school_dates sd
                    on a.school_dates_key = sd.school_dates_key
                inner join k12intel_dw.dtbl_students s
                  on a.student_key = s.student_key
                inner join k12intel_dw.dtbl_schools  sc
                    on sc.school_key = s.school_key
                where 1=1
                and sd.rolling_local_school_yr_number = 0
                and a.attendance_type in ('LA','LP','LF')
                and sc.school_code= ?
                and s.student_current_grade_level = ?
                group by s.student_id) e
          on e.student_id = a.student_id
    </sql-query>   

</hibernate-mapping>

这是我的 DAO:

@Repository
public class K12DaoImpl implements K12DaoManager{   

    @PersistenceContext
    private EntityManager em;

//  @Autowired
//    private SessionFactory sessionFactory;
//
//    public void setSessionFactory(SessionFactory sessionFactory) {
//      this.sessionFactory = sessionFactory;
//  }

    @Override
    @Transactional(readOnly = true)
    public List<AttendanceBreakDown> getAttendanceBreakDownBySchoolAndGP(int school, String gradingPeriod, String gradeLevel) {

        Object values[] = new Object[]{new Integer(school), gradingPeriod, gradeLevel,
                                       new Integer(school), gradingPeriod, gradeLevel,
                                       new Integer(school), gradingPeriod, gradeLevel,
                                       new Integer(school), gradingPeriod, gradeLevel,
                                       new Integer(school), gradeLevel
                                      };
//        Call Named Query through JPA
//        Query query = em.createNamedQuery("attendanceDetailsBySchoolAndGradingPeriod");
//        
//        for (int i = 0; i < values.length; i++) {
//          query.setParameter(i, values[i]);
//        }
//        
//        List<AttendanceBreakDown> list = query.getResultList();
//        

//        Call Named Query through Hibernate's SessionFactory        
//        org.hibernate.Query query = sessionFactory.getCurrentSession().getNamedQuery("attendanceDetailsBySchoolAndGradingPeriod");
//        
//        for (int i = 0; i < values.length; i++) {
//          query.setParameter(i, values[i]);
//        }
//        
//        List<AttendanceBreakDown> list =  query.list();

        //Call Named Query through HibernateTemplate
        //List<AttendanceBreakDown> list =  getHibernateTemplate().findByNamedQuery("attendanceDetailsBySchoolAndGradingPeriod", values); 

        //return list;
        return null;
    }
}

之前,在不使用 persistence.xml 的情况下,我在 applicationContext-datasource 中使用了典型的 hibernate.cfg.xml 设置,其中包含会话工厂,会话工厂绑定到数据源等。一切正常。

现在我有了 persistence.xml,不再有 SessionFactory、EntityManager。

如何加载 hbm.xml 文件并通过 Hibernate 而不是通过 JPA 2.0 执行它们?

如果您在 DAO 中看到注释的代码,如果我使用 Hibernate 配置,通过 HibernateTemplate(扩展 HibernateDaoSupport)调用命名查询正在工作。现在的代码会是什么样子?

Thanks


我已经找到了我自己问题的答案。为了使它工作,这就是我所做的:

  1. 使用...hbm.xml映射文件> inside in 持久性.xml罢工>。我真的没有用过...hbm.xml映射文件>标签,因为这给了我各种各样的异常,其中之一是 DuplicateMappingException。根据文档,我还认为我必须使用该标签,但事实证明您不必这样做。

  2. Created edu/kdc/visioncards/pojo/AttendanceBreakDown.hbm.xml under src/主/资源

  3. 终于在我的DAO,我有如下:

    @Override
    @Transactional(readOnly = true)
    public List<AttendanceBreakDown> getAttendanceBreakDownBySchoolAndGP(int school, String gradingPeriod, String gradeLevel) {
         Object values[] = new Object[]{new Integer(school), gradingPeriod, gradeLevel,
                                   new Integer(school), gradingPeriod, gradeLevel,
                                   new Integer(school), gradingPeriod, gradeLevel,
                                   new Integer(school), gradingPeriod, gradeLevel,
                                   new Integer(school), gradeLevel
                                  };
    
         org.hibernate.Session session = (Session) em.getDelegate();
         org.hibernate.Query query = session.getNamedQuery("attendanceDetailsBySchoolAndGradingPeriod");
         for (int i = 0; i < values.length; i++) {
            query.setParameter(i, values[i]);
         }
         List<AttendanceBreakDown> list =  query.list();
         return list;
    }
    

现在,我可以通过 EntityManager 使用 JPA 2.0,并进入 Hibernate 的会话,以访问 JPA 2.0 不提供的所有 Hibernate 功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JPA 2.0 项目中加载 Hibernate 'xxx.hbm.cfg' 文件? 的相关文章

随机推荐

  • Asp.Net 拒绝用户访问某些页面

    如何允许用户访问我的 Web 应用程序 但拒绝他们访问特定页面 我希望允许更多用户使用我构建的应用程序 但有几个页面我不希望他们能够访问 这是我现在在 Web config 中的内容
  • Angular 6:onChange mat-slide-toggle 条件验证从对象数组中仅选择一个选项

    我有一份清单mat slide toggle 一次只有一个滑块将保持启用状态 而其他滑块将保持禁用状态 现在 当单击该启用的滑块时 其值将被更改 同时其他滑块列表将被启用以供选择 一旦选择一个滑块 其他滑块将被禁用 所以 简而言之 整个数组
  • 为什么字节码编程不如汇编编程那么流行或盛行?

    您可以在互联网上看到汇编代码和汇编编码器 但几乎没有字节码 这是为什么 汇编编程的需求和优点也适用于字节码编程 字节码编程远不如汇编编程流行 常见的另一个原因是字节码的通用性 它的简单性 字节码指令集主要是 ultra RISC 非常简单的
  • 为什么在 Dao 设计模式或其他设计模式中使用接口

    请参阅以下 Dao 设计模式的组成部分 数据访问对象模式或 DAO 模式用于将低级数据访问 API 或操作与高级业务服务分开 以下是数据访问对象模式的参与者 数据访问对象接口 该接口定义要在模型对象上执行的标准操作 数据访问对象具体类 该类
  • TypeScript 编译中的实验装饰器警告

    我收到警告 对装饰器的实验性支持是一项在未来版本中可能会发生变化的功能 设置 experimentalDecorators 选项 以删除此警告 即使我的 tsconfig json 中的compilerOptions具有以下设置 emitD
  • 提交时如何将 Git 提交 ID 填充到文件中?

    我想创建 Git 钩子 它将填充我将要在源代码中创建的文件 基本上是变量替换 的提交的提交 ID 这可以用 Git 实现吗 或者事实上 通过将变量解析为 git id 我将更改 sha 1 从而导致 先有鸡还是先有蛋 的问题 我针对类似情况
  • Cucumber @Before 钩子运行两次 @After 一次

    给所有人 目前正在写一个BDD测试自动化框架 使用Java11 Junit5 Cucumber Selenium 构建工具 Gradle 创建了一个用于验证 Google 标题的小测试 开始测试时 使用Test task在 Gradle 或
  • 如何在 jQuery 中获取图像的当前位置?

    我一直在开发一个具有背景的图像处理脚本 用户可以将一个或多个图像上传到该背景上 我希望用户能够在背景周围拖动和移动 最后他们可以生成最终图像 但是 我不知道如何获取 BG 上可拖动图像位置的位置 我一直在互联网和电子书上搜索 但没有任何线索
  • htaccess 带有 PHP 和 URL 变量的漂亮 URL

    希望有人可以在这里提供一些帮助 这是一个涉及多个层面的问题 简而言之 我想要拥有漂亮的 URL 这些 URL 使用文件夹中文件的 URL 变量 所以 我想要http www example com page path to page htt
  • 未定义的方法“save”使测试在测试结束之前失败

    我正在关注 ruby railstutorial org 我遇到了一些麻烦 但我解决了它们 然而 现在我在谷歌上搜索了相当长的一段时间 检查了代码 我什至知道为什么测试失败 但不知道如何让它通过 所以 问题来了 我有一个用户模型 class
  • 无法将密钥发送到定向 Paypal 登录页面

    我正在为 Paypal Checkout 编写一个自动填充机器人 paypal 登录页面是从另一个网站重定向的 因此与官方 paypal 登录页面略有不同 尽管 HTML 类似 我尝试过不同的方法 比如switch to frame scr
  • 运行 Spring MVC 测试时出现 NoSuchMethod 错误

    我正在尝试按照 Spring in Action 第四版 第 5 章中的示例来创建我自己的项目 仍然是企业级的新手 我正在使用 Windows 7 PC Java 7 Spring 4 和 Maven 当我运行 ClinicalNoteCo
  • Hbase快速统计行数

    现在我实现了行计数ResultScanner像这样 for Result rs scanner next rs null rs scanner next number 如果数据达到百万次计算量很大 我想实时计算我不想使用Mapreduce
  • Spring框架4.3.0 - 我什么时候需要@Autowired?

    我刚刚开始学习 Spring 框架 我使用版本 4 3 0 我认为我们需要 Autowired 来告诉框架何时一个类需要注入 不过 我今天尝试这样做 Component public class CDPlayer implements Me
  • 如何在 C++ 中创建动态数组的数组

    我正在尝试学习 C 并尝试为简单的哈希表编写代码 如下结构 array 0 0 array 0 1 array 0 2 key 1 value 1 value 2 array 1 0 array 1 1 key 2 value 3 arra
  • SQLAlchemy 关系加载器在表上留下锁?

    我有非常简单的代码导致我的 MySQL 数据库挂起 import sqlalchemy as sa from sqlalchemy import orm creating the engine the base etc import uti
  • 如何在 Jetty 中部署 Servlet?

    我创建了一个简单的 Servlet 我想将其部署在 Jetty 7 2 中 Jetty 正在运行并且能够为 JSP 页面提供服务http localhost 8080 jonas test jsp 我用 Jetty 启动java jar s
  • React 18 TypeScript 儿童 FC

    我升级到 React 18 并且编译得很好 如今 似乎每个使用子组件的组件都会抛出错误 Property children does not exist on type IPageProps 在儿童道具自动包含在之前FC界面 现在看来我必须
  • 将 IN 子句与 PIG FILTER 结合使用

    PIG 支持 IN 子句吗 filtered FILTER bba BY reason not in a b c d 或者我应该把它分成多个 OR Thanks 您可以使用 Apache DataFu 中的以下 udf 代替 这将帮助您避免
  • 如何在 JPA 2.0 项目中加载 Hibernate 'xxx.hbm.cfg' 文件?

    我刚刚启动了一个 Spring Roo 应用程序 使用 Hibernate 作为 JPA2 0 提供程序 我使用罐 子的方式如下 hibernate core 3 6 4 Final jar hibernate commons annota