Question

Je viens de commencer une application Spring Roo avec Hibernate en tant que fournisseur de JPA2.0. J'utilise les bocaux comme suit:

hiberner-core-3.6.4.Final.jar

hibernate-commons-annotations-3.2.0.jar

Mise en veille prolongée-entitymanager-3.6.4.Final.jar

hiberner-jpa-2,0-api-1.0.0.Final.jar

Mise en veille prolongée validateur-4.1.0.Final.jar

J'utilise des annotations pour gérer l'aspect transactionnel de l'application, pas de problème.

Mais il y a d'autres parties de l'application qui nécessitent des requêtes très complexes, et la façon dont je l'avais traité en veille prolongée avant était de créer un fichier de mappage par exemple (mybigdwquery.hbm.xml) où je préciserais ma requête et sa cartographie objet, un POJO. Pas un @Entity. Cela fonctionne très bien.

Cependant, à travers une autre question que je tition, je trouve que dans JPA 2.0, vous ne pouvez pas avoir des requêtes mises en correspondance avec un POJO, tout doit être mis en correspondance avec une @Entity (une table db non?).

Ma question est la suivante:

Est-il possible que je peux avoir mon dossier mybigdwquery.hbm.xml chargé dans mon persistence.xml comme hbm.xml pour que je puisse appeler la requête nommée?

Mon persistence.xml est comme suit:

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

Le fichier que j'ai besoin chargé:

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

Ceci est mon OAC:

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

Avant, sans utiliser persistence.xml j'avais les paramètres de hibernate.cfg.xml typiques à l'intérieur d'un applicationContext-datasource avec elle fabrique de session, l'usine de la session liée à la source de données, etc .. un tout beau travail.

Maintenant, j'ai persistence.xml, pas plus SessionFactory, EntityManager maintenant.

Comment puis-je charger des fichiers hbm.xml et les exécuter par Hibernate plutôt que par JPA 2.0?

Si vous voyez le code commenté dans le DAO Si j'utilisais une configuration Hibernate appel à la requête nommée par le HibernateTemplate (extension HibernateDaoSupport) travaillait. Qu'est-ce que le code serait comme maintenant?

Merci

Était-ce utile?

La solution

J'ai trouvé la réponse à ma propre question. Pour faire fonctionner ce que je l'ai fait:

  1. Utilisez ... hbm.xml dans persistence.xml . Je n'ai pas eu l'utilisation ... hbm.xml tag que cela me donnait toutes sortes d'exceptions L'un d'eux DuplicateMappingException. D'après les documents que je pense aussi que je devais utiliser cette balise, mais il se avère que vous n'avez pas.

  2. Créé edu / KDC / visioncards / POJO / AttendanceBreakDown.hbm.xml sous src / main / ressources

  3. Enfin dans mon OAC , j'ai comme suit:

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

Maintenant, je peux utiliser JPA 2.0 à EntityManager et descendre à la session de mise en veille prolongée pour avoir accès à toutes Hibernate dispose que JPA 2.0 ne propose pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top