最近在研究JPA,写了一个简单的测试类,但是测试结果报错了。我用的是junit4来测试的。相应的jar包及数据库驱动包都导入了。
         @Entity
        public class ProductType {
private int typeid;
public int getTypeid() {
return typeid;
}
        @Id @GeneratedValue(strategy=GenerationType.AUTO)
   public void setTypeid(int typeid) {
this.typeid = typeid;
}
       }
     
      persistence.xml 放在src 的一个META-INF文件下
        <?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_1_0.xsd" 
version="1.0">  <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
   <properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySql5Dialect"/>
    <property name="hibernate.connection.driver_class" value="org.git.mm.mysql.Driver"/>
<property name="hibe-rnate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="hibernate.max_fetch_depth" value="3"/>
    <!--  <property name="hibernate.max_fet-=ch_depth" value="3"/>-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.jdbc.fetch_size" value="18"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="false"/> 
</properties>
 </persistence-unit>
</persistence>  测试类如下
      public class ProductTest { @BeforeClass
public static void setUpBeforeClass() throws Exception {
}
    @Test
    public void runtest(){
      Persistence.createEntityManagerFactory("itcast");
    }
}
  一跑就报
     javax.persistence.PersistenceException: [PersistenceUnit: itcast] Unable to configure EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:265)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
at junit.test.ProductTest.runtest(ProductTest.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.hibernate.AnnotationException: No identifier specified for entity: bolink.bean.product.ProductType
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:671)
at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:534)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:286)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115)
at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1225)
at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:159)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253)
... 24 more

解决方案 »

  1.   

    你应该看看你ProductType的hbm映射文件,是不是正确生成了ID属性,因为根源是:
    bolink.bean.product.ProductType 没有定义id
      

  2.   

    持久化异常
    你的ProductType.hbm.xml怎么没导入到配置文件里
    hibernate根本找不到bolink.bean.product.ProductType 
    然后Debug到底是那里错误
      

  3.   


       Debug 了,直接报错啊
       
      
      

  4.   

    我试了一下测试通过。persistence.xml 跟你写得差不多,只是把 org.hibernate.dialect.MySql5Dialect 改成了
    org.hibernate.dialect.MySQL5Dialect,其他跟你的基本上没有什么区别。我用的 MySQL 表结构是下面这样的:CREATE TABLE t_mt_stat (
      id         int(10) unsigned   NOT NULL auto_increment,
      mt_time    datetime           NOT NULL,
      stat       varchar(20)        NOT NULL,
      stat_time  datetime           NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;persistence.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_1_0.xsd"
      version="1.0">  <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
          <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
          <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
          <property name="hibe-rnate.connection.username" value="root" />
          <property name="hibernate.connection.password" value="" />
          <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
          <property name="hibernate.max_fetch_depth" value="3" />
          <!--  <property name="hibernate.max_fet-=ch_depth" value="3"/>-->
          <property name="hibernate.hbm2ddl.auto" value="update" />
          <property name="hibernate.jdbc.fetch_size" value="18" />
          <property name="hibernate.jdbc.batch_size" value="10" />
          <property name="hibernate.show_sql" value="false" />
          <property name="hibernate.format_sql" value="false" />
        </properties>
      </persistence-unit>
    </persistence>Entity 类是这样的:import java.util.Date;import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;@Entity
    @Table(name = "T_MT_STAT")
    public class MtStat {
        
        private Integer id;
        private Date mtTime;
        private String stat;
        private Date statTime;
        
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        public Integer getId() {
            return id;
        }
        
        public void setId(Integer id) {
            this.id = id;
        }
        
        @Column(name = "mt_time")
        @Temporal(TemporalType.TIMESTAMP)
        public Date getMtTime() {
            return mtTime;
        }
        
        public void setMtTime(Date mtTime) {
            this.mtTime = mtTime;
        }
        
        @Column(name = "stat")
        public String getStat() {
            return stat;
        }
        
        public void setStat(String stat) {
            this.stat = stat;
        }
        
        @Column(name = "stat_time")
        @Temporal(TemporalType.TIMESTAMP)
        public Date getStatTime() {
            return statTime;
        }
        
        public void setStatTime(Date statTime) {
            this.statTime = statTime;
        }
        
        public String toString() {
            return new StringBuilder().append("id: ").append(id)
                .append(", mt_time: ").append(mtTime == null ? "null" : String.format("%tF %<tT", mtTime))
                .append(", stat: ").append(stat)
                .append(", stat_time: ").append(statTime == null ? "null" : String.format("%tF %<tT", statTime))
                .toString();
        }
    }测试类是:
    import java.util.Date;
    import java.util.List;import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.Query;import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;import com.bao.jpa.entity.MtStat;public class EntityManagerTest {
        
        private EntityManager em;
        
        @Before
        public void before() {
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
            Assert.assertNotNull(factory);
            
            em = factory.createEntityManager();
            Assert.assertNotNull(em);
        }
        
        @Test
        public void test() {        
            List<MtStat> list = getAllMtStats();
            Assert.assertNotNull(list);
            
            int count = list.size();
            
            persist();
            
            list = getAllMtStats();
            Assert.assertEquals(list.size(), count + 1);
        }
        
        @After
        public void after() {
            em = null;
        }
        
        @SuppressWarnings("unchecked")
        private List<MtStat> getAllMtStats() {
            String jpql = "SELECT m FROM MtStat m";
            Query query = em.createQuery(jpql);
            return query.getResultList();
        }
        
        private void persist() {
            EntityTransaction transaction = em.getTransaction();        
            try {
                transaction.begin();
                MtStat mt = new MtStat();
                mt.setMtTime(new Date());
                mt.setStat("N");
                mt.setStatTime(new Date());
                em.persist(mt);
                transaction.commit();
            } catch(Exception e) {
                transaction.rollback();
            }
        }
    }
      

  5.   

      谢谢bao110908  的回答
      非常感谢
      我马上结贴,分给你
      

  6.   

     To bao110908 
      我给了你90分啊,怎么没有显示啊
     
      

  7.   

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    public void setTypeid(int typeid) {
        this.typeid = typeid;
    } 你把注解放到getTypid()方法上@Id @GeneratedValue(strategy=GenerationType.AUTO)
    public int getTypeid() {
        return typeid ;

      

  8.   

    package com.hydao.entity;import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;@Entity
    public class ProductType {
      
    private Integer typeid;
        
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer getTypeid() {
    return typeid;
    } public void setTypeid(Integer typeid) {
    this.typeid = typeid;
    }}
    package com.hydao.junit.test;import javax.persistence.Persistence;import org.junit.BeforeClass;
    import org.junit.Test;public class ProductTest { @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    } @Test
    public void runtest() {
    Persistence.createEntityManagerFactory("itcast");
    System.out.println("我很好   早啊 ");
    }}<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_1_0.xsd"
    version="1.0">
    <!-- name  databaseName -->
    <persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
    <property name="hibernate.dialect"
    value="org.hibernate.dialect.MySQL5Dialect" />
    <!--
    <property name="hibernate.format_sql" value="false"/>
    <property name="hibernate.use_sql_comments" value="false"/>-->
    <property name="hibernate.connection.driver_class"
    value="org.git.mm.mysql.Driver" />
    <property name="hibernate.connection.username" value="root" />
    <property name="hibernate.connection.password" value="root" />
    <property name="hibernate.connection.url"
    value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8" />
    <property name="hibernate.max_fetch_depth" value="3" />
    <property name="hibernate.hbm2ddl.auto" value="update" />
    <property name="hibernate.show_sql" value="true" />
    </properties>
    </persistence-unit>
    </persistence>抛出的异常信息是 :
    javax.persistence.PersistenceException: Unable to configure EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:265)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
    at junit.test.PersonTest.save(PersonTest.java:19)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    Caused by: java.lang.NullPointerException
    at org.hibernate.util.DTDEntityResolver.resolveInHibernateNamespace(DTDEntityResolver.java:104)
    at org.hibernate.cfg.EJB3DTDEntityResolver.resolveEntity(EJB3DTDEntityResolver.java:53)
    at com.sun.org.apache.xerces.internal.util.EntityResolverWrapper.resolveEntity(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.resolveEntity(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.resolveDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at org.hibernate.ejb.packaging.PersistenceXmlLoader.loadURL(PersistenceXmlLoader.java:70)
    at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(PersistenceXmlLoader.java:89)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:222)
    ... 24 more怎么解决   谢谢  啦