您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Java >> JPA 环境测试报错

JPA 环境测试报错

来源:网络整理     时间:2016/7/1 14:47:53     关键词:

关于网友提出的“ JPA 环境测试报错”问题疑问,本网通过在网上对“ JPA 环境测试报错”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: JPA 环境测试报错
描述:

    最近在研究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文件下
        

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"> 
 
  org.hibernate.ejb.HibernatePersistence
   
    
    


    

    




 

 

  测试类如下
      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.xml怎么没导入到配置文件里
hibernate根本找不到bolink.bean.product.ProductType 
然后Debug到底是那里错误

解决方案2:

帮顶

解决方案3:

不懂,帮你顶

解决方案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 是这样的(几乎是抄你的):


  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">
  
    org.hibernate.ejb.HibernatePersistence
    
      
      
      
      
      
      
      
      
      
      
      
      
    

  

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 %<>
            .append(", stat: ").append(stat)
            .append(", stat_time: ").append(statTime == null ? "null" : String.format("%tF %<>
            .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 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 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:

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


以上介绍了“ JPA 环境测试报错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2181831.html

相关图片

相关文章