2011-12-02 18 views
5

Tôi vừa mới bắt đầu một ứng dụng Spring Roo với Hibernate như một nhà cung cấp JPA2.0. Tôi đang sử dụng các lọ như sau:Làm thế nào để tải tệp Hibernate 'xxx.hbm.cfg' trong dự án JPA 2.0?

hibernate-core-3.6.4.Final.jar

ngủ đông-commons-chú thích-3.2.0.jar

ngủ đông-EntityManager -3.6.4.Final.jar

hibernate-JPA-2,0-api-1.0.0.Final.jar

hibernate-validator-4.1.0.Final.jar

Tôi đang sử dụng chú thích để xử lý khía cạnh giao dịch của ứng dụng, không có vấn đề ở đó. Có một số phần khác của ứng dụng yêu cầu các truy vấn rất phức tạp, và cách tôi đã xử lý nó trong Hibernate trước đây là tạo một tệp ánh xạ ví dụ (mybigdwquery.hbm.xml), nơi tôi sẽ chỉ định truy vấn của mình và truy vấn của nó đối tượng ánh xạ, POJO. Không phải là @Entity. Điều này hoạt động tốt.

Tuy nhiên, thông qua một câu hỏi khác mà tôi đã đăng trước đó, tôi phát hiện ra rằng trong JPA 2.0 bạn không thể có các truy vấn được ánh xạ tới POJO, mọi thứ phải được ánh xạ tới @Entity (bảng db không?).

Vì vậy, câu hỏi của tôi là như sau:

Có cách nào mà tôi có thể có của tôi 'mybigdwquery.hbm.xml' tập tin được tải trong persistence.xml tôi như là một hbm.xml vì vậy mà tôi có thể gọi truy vấn được đặt tên?

persistence.xml của tôi là như sau:

<?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> 

Các tập tin mà tôi cần nạp:

<?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> 

Đây là DAO tôi:

@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; 
    } 
} 

Trước đây, mà không sử dụng bền bỉ .xml Tôi đã có các thiết lập hibernate.cfg.xml điển hình bên trong một applicationContext-datasource với phiên làm việc của nó, sion nhà máy gắn liền với các nguồn dữ liệu vv .. một tất cả mọi thứ làm việc tốt.

Bây giờ tôi có persistence.xml, không còn SessionFactory, EntityManager bây giờ nữa.

Làm cách nào để tải các tệp hbm.xml và thực thi chúng qua Hibernate thay vì thông qua JPA 2.0?

Nếu bạn thấy mã nhận xét trong DAO Nếu tôi đang sử dụng cấu hình Hibernate, hãy gọi truy vấn được đặt tên qua HibernateTemplate (mở rộng HibernateDaoSupport) đang hoạt động. Mã sẽ như thế nào bây giờ?

Cảm ơn

Trả lời

3

Tôi đã tìm thấy câu trả lời cho câu hỏi của riêng mình.Để làm cho nó làm việc này là những gì tôi đã làm:

  1. Sử dụng < mapping-file> ... hbm.xml </mapping-file> bên < kiên trì đơn vị> trong kiên trì .xml . Tôi thực sự không có sử dụng các tệp ánh xạ < ánh xạ> ... hbm.xml </mapping-file> vì điều đó đã cho tôi tất cả các loại ngoại lệ mà một trong số chúng là DuplicateMappingException. Theo các tài liệu, tôi cũng nghĩ rằng tôi đã phải sử dụng thẻ đó, nhưng nó chỉ ra rằng bạn không phải.

  2. Created edu/kdc/visioncards/POJO/AttendanceBreakDown.hbm.xml dưới src/main/nguồn

  3. Cuối cùng trong DAO tôi, tôi có như sau:

    @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; 
    } 
    

Bây giờ tôi có thể sử dụng JPA 2.0 thông qua EntityManager và bước xuống phiên Hibernate để có quyền truy cập vào tất cả H các tính năng ibernate mà JPA 2.0 không cung cấp.

+1

OK, tôi hiểu. Tôi đã tò mò về nó, và câu trả lời của riêng bạn làm tôi bối rối. Vì vậy, tôi đoán có tệp .hbm.xml với cùng một gói và tên như @Entity của bạn là đủ để nó được chọn bởi Hibernate EntityManager. – greyfairer