2015-07-01 61 views
3

我收到一个提示以下错误:休眠 - OGM [PersistenceUnit:人]无法建立的SessionFactory

异常线程 “main” javax.persistence.PersistenceException:[PersistenceUnit:人]无法建立Hibernate的SessionFactory 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1249) 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access $ 600(EntityManagerFactoryBuilderImpl.java:120) 在org.hibernate作为.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform(EntityManagerFactoryBuilderImpl.java:860) 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform(EntityManagerFactoryBuilderImpl.java:850) 在org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) 在组织.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) 在org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) 在org.hibernate.ogm.jpa.HibernateOgmPersistence.createEntityManagerFactory (HibernateOgmPersistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at com.ihappyk.ut ity.Utility.setUpEntityManagerFactory(Utility.java:11)​​ at com.ihappyk.work.PersonWorker.main(PersonWorker.java:14) 引起:org.hibernate.MappingException:无法实例化id生成器[entity-name = com.ihappyk.model.Person] 在org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:123) 在org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:225) 在org.hibernate.internal.SessionFactoryImpl。(SessionFactoryImpl.java:323) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform( EntityManagerFactoryBuilderImpl.java:857) ... 9更多 引起:org.hibernate.HibernateException:意料之外的返回类型[java.lang.Long] UUID转换 at org.hibernate.id.UUIDGenerator.configure(UUIDGenerator.java:111) at org.hibernate.id .factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:117) ... 13更

Utilty.java

public class Utility { 
    private static EntityManagerFactory entityManagerFactory; 

    //@BeforeClass 
    public static EntityManagerFactory setUpEntityManagerFactory() { 
     entityManagerFactory = Persistence.createEntityManagerFactory("person"); 
     return entityManagerFactory; 
    } 

    //@AfterClass 
    public static void closeEntityManagerFactory() { 
     entityManagerFactory.close(); 
    } 
} 

持久类

@Entity 
public class Person { 

     @Id 
     @GeneratedValue(generator = "uuid") 
     @GenericGenerator(name = "uuid", strategy = "uuid2") 
     private long id; 

     private String firstName; 
     private String lastName; 

     public long getId() { 
      return id; 
     } 
     public void setId(long id) { 
      this.id = id; 
     } 
     public String getFirstName() { 
      return firstName; 
     } 
     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 
     public String getLastName() { 
      return lastName; 
     } 
     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     public Person(){ 

     } 

     public Person(String firstName, String lastName) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     }  
} 

主类

public class PersonWorker { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     EntityManagerFactory emf = Utility.setUpEntityManagerFactory(); 

     EntityManager em = emf.createEntityManager(); 

     em.getTransaction().begin(); 

      // create a Person 
     Person bob = new Person("Bob", "McRobb"); 

     em.persist(bob); 
     em.getTransaction().commit(); 
     em.close(); 
     emf.close(); 

    } 

} 

persistance.xml

<?xml version="1.0"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 

    <persistence-unit name="person" transaction-type="JTA"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 
     <class>com.ihappyk.model.Person</class> 
     <properties> 
      <property name="hibernate.ogm.datastore.provider" value="mongodb" /> 
      <property name="hibernate.ogm.datastore.database" value="hibernateOGM" /> 
      <property name="hibernate.ogm.datastore.host" value="127.0.0.1" /> 
      <property name="hibernate.ogm.datastore.port" value="27017" /> 
      <property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> 

      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

这属于'eclipse'项目管理。你应该明确地标记你的'persistence.xml'被添加到build中。 – Andremoniy

+0

我已经在项目的构建路径中配置了它。 – ihappyk

回答

6

的根异常说明了一切:

Caused by: org.hibernate.HibernateException: Unanticipated return type [java.lang.Long] for UUID 

您使用的是它不支持类型UUID ID生成。在这种情况下,您应该使用String而不是Long

+0

但这个例子是在你提供的链接上给出的。它仍然是 – ihappyk

+0

,无法建立hibernateSession工厂 – ihappyk

-1

我不知道,如果问题仍然存在,但我认为你必须把persistence.xml文件到的src/main/META-INF文件夹。我看到你把它放到src/META-INF中。也许这就是问题所在?当然你要链接的实体属于中的src/main文件夹,太:)

+0

只是一些像Maven一样使用/ src/main/...的工具,在普通的java项目中,这是一个正确的位置。 – Skizzo

0

首先,你应该分享有关异常和persistence.xml中的内容完整堆栈跟踪。然后在我看来,根据我看到的问题可能是,您没有在persistence.xml中声明持久性提供者。事实上,如果你正在开发一个非容器管理环境,你需要声明一个持久化提供者。

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0"> 
    <persistence-unit name="myunit" > 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    //Others properties 
</persistence-unit> 

1
  1. 如果使用这种过时org.hibernate.ejb.HibernatePersistence设置新的供应商像下面

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

如果值
  • <property name="hibernate.hbm2ddl.auto" value="update" />

    组 “创建拖放”

    <property name="hibernate.hbm2ddl.auto" value="create-drop" />

  • XML路径:资源/ META-INF/persistence.xml中
  • For mysql
  • <?xml version="1.0" encoding="UTF-8"?>

    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    
         <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
          <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
          <properties> 
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
            <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
            <property name="hibernate.show_sql" value="true"/> 
            <property name="hibernate.connection.username" value="yourname"/> 
            <property name="hibernate.connection.password" value="yourpassword"/> 
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/yourschema"/> 
            <property name="hibernate.max_fetch_depth" value="3"/> 
          </properties> 
         </persistence-unit> 
    
        </persistence>