Hibernate - OGM [PersistenceUnit:person]无法构建Hibernate SessionFactory

时间:2015-07-01 12:15:33

标签: java xml hibernate hibernate-ogm

我收到以下错误

  

线程中的异常" main" javax.persistence.PersistenceException:[PersistenceUnit:person]无法构建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)       at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)       在org.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)       在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)       在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)       at com.ihappyk.utility.Utility.setUpEntityManagerFactory(Utility.java:11)       在com.ihappyk.work.PersonWorker.main(PersonWorker.java:14)   引起:org.hibernate.MappingException:无法实例化id生成器[entity-name = com.ihappyk.model.Person]       at 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)       在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)       在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform(EntityManagerFactoryBuilderImpl.java:857)       ......还有9个   引起:org.hibernate.HibernateException:用于UUID转换的意外返回类型[java.lang.Long]       在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();
    }
}

Persistant Class

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

4 个答案:

答案 0 :(得分:8)

根异常说明了一切:

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

您正在使用不支持的类型的UUID ID生成器。在这种情况下,您应该使用String代替Long

答案 1 :(得分:1)

  1. 如果您使用此已弃用的org.hibernate.ejb.HibernatePersistence设置新提供程序,如下所示
  2.   

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

    1. 如果您的价值是
    2.   

      <property name="hibernate.hbm2ddl.auto" value="update" />

      设置“create-drop”

        

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

      1. XML路径:resources / META-INF / persistence.xml
      2. 对于mysql
      3.   

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

答案 2 :(得分: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>

答案 3 :(得分:-1)

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

相关问题