2013-05-09 50 views
0

我有一个用Spring MVC 3开发并用Maven 3构建的Hibernate项目。我使用特定的Hibernate Framework管理JPA的持久性;我想这不是很难配置我现有的OpenJpa源代码,但我对它很陌生,我想知道什么是配置我的项目以从Hibernate到OpenJpa以一致的方式切换的步骤。如何从休眠状态切换到OpenJpa

问候

+0

我加我的搜索一些解释和结果: - 在Spring中定义豆一样的,但变成OpenJPA的供应商 -I've JPA的供应商到OpenJPA插件添加到我的pom.xml -I've更改persistence.xml文件,但是什么和如何? – andPat 2013-05-09 12:52:39

回答

1

遵循以下步骤:

要切换到注释,你需要:

Add hibernate-annotations and JPA jars 
Annotate your classes 
Modify hibernate.cfg.xml to use classes instead of mapping files 
Modify your HibernateUtil class to use a different configuration (this is the step that tripped me up) 

加入正确的罐子,我使用Maven和补充以下附加依赖关系:

<dependency> 

    <groupId>javax.persistence</groupId> 

    <artifactId>persistence-api</artifactId> 

    <version>1.0</version> 

</dependency> 

<dependency> 

<groupId>org.hibernate</groupId> 

    <artifactId>hibernate-annotations</artifactId> 

    <version>3.3.1.GA</version> 

</dependency> 

在JPA上有许多优良的资源注释,所以我不打算详细讨论这一点。你得东西,看起来像这样:

@Entity 

@Table(name = “USERS”) 

public class User { 

@Id @GeneratedValue 

@Column(name = “USER_ID”) 

private Long id; 

@Column(name = “FIRST_NAME”) 

private String firstName; 

@Column(name = “LAST_NAME”) 

private String lastName; 

@Column(name = “EMAIL”) 

private String email; 

// etc 

} 

要更新hibernate.cfg.xml文件,你要改线路是这样的:

<mapping resource="org/terracotta/reference/exam/domain/User.hbm.xml"/> 

到这样的事情:

<mapping class="org.terracotta.reference.exam.domain.User"> 

如果你做了这一切,停在那里,你可能会看到这样的异常:

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at org.terracotta.reference.exam.domain.HibernateUtil.<clinit>(HibernateUtil.java:15) 
    at org.terracotta.reference.exam.domain.Main.main(Main.java:12) 
Caused by: org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="org.terracotta.reference.exam.domain.User"/> 
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1600) 
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555) 
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1534) 
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1508) 
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1428) 
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1414) 
    at org.terracotta.reference.exam.domain.HibernateUtil.<clinit>(HibernateUtil.java:13) 

而且,像我一样,你会感到困惑。事实证明,在使用注释时,您需要使用AnnotationConfiguration(特定于注释的配置的子类)。所以,你的HibernateUtil可能看起来像这样:

package org.terracotta.reference.exam.domain; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 

public class HibernateUtil { 

private static SessionFactory sessionFactory; 

static { 

try { 

sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 

} catch(Throwable t) { 

throw new ExceptionInInitializerError(t); 

} 

} 

public static SessionFactory getSessionFactory() { 

return sessionFactory; 

} 

public static void shutdown() 
{ 

getSessionFactory().close(); 

} 

} 

希望帮助!!

+0

非常感谢!我有两个问题。我从来没有配置hibernate.cfg.xml,我的项目中没有一个......是否有必要将Hibernate配置改为使用像OpenJpa这样的并发框架? 除了我在第一条评论中提到的步骤之外,是否还必须执行所有这些步骤? – andPat 2013-05-09 13:32:05