关于网友提出的“ 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