如何加载 Hibernate“xxx.hbm.cfg” JPA 2.0 项目中的文件?
我刚刚启动了一个 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) <= 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) <= 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) <= 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)) < .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)调用命名查询正在工作。现在的代码会是什么样子?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我已经找到了我自己问题的答案。为了使它工作,这就是我所做的:
在...hbm.xml persistence.xml中的 -unit>。我确实没有使用在src/main/resources下创建了edu/kdc/visioncards/pojo/AttendanceBreakDown.hbm.xml
最后在我的DAO,我有如下:
<前><代码>@Override
@Transactional(只读 = true)
公共列表<出勤细目> getAttendanceBreakDownBySchoolAndGP(int school, 字符串 gradingPeriod, 字符串 GradeLevel) {
对象值[] = new Object[]{new Integer(学校), gradingPeriod, GradeLevel,
新整数(学校),gradingPeriod,gradeLevel,
新整数(学校),gradingPeriod,gradeLevel,
新整数(学校),gradingPeriod,gradeLevel,
新整数(学校),年级
};
org.hibernate.Session session = (Session) em.getDelegate();列表=查询.列表();
org.hibernate.Query query = session.getNamedQuery("attendanceDetailsBySchoolAndGradingPeriod");
for (int i = 0; i
返回列表;
}
现在我可以通过 EntityManager 使用 JPA 2.0 并进入 Hibernate 的 Session,以访问 JPA 2.0 提供的所有 Hibernate 功能不提供。
I have found the answer to my own question. To make it work this is what I have done:
Use <mapping-file>...hbm.xml</mapping-file> inside <persistence-unit> in persistence.xml. I really did not have the use the <mapping-file>...hbm.xml</mapping-file> tag as that was giving me all sorts of exceptions one of them was DuplicateMappingException. According to the docs I also thought I had to use that tag, but it turns out that you do not have to.Created edu/kdc/visioncards/pojo/AttendanceBreakDown.hbm.xml under src/main/resources
Finally in my DAO, I have as follows:
Now I can use JPA 2.0 through EntityManager and step down to Hibernate's Session to have access to all Hibernate features that JPA 2.0 does not offer.