Java 在H2数据库不在netbeans中工作的情况下休眠
我无法用一个非常简单的代码让Hibernate在netbeans上使用H2数据库。请帮忙!我得到这个错误:Java 在H2数据库不在netbeans中工作的情况下休眠,java,hibernate,jpa,netbeans,Java,Hibernate,Jpa,Netbeans,我无法用一个非常简单的代码让Hibernate在netbeans上使用H2数据库。请帮忙!我得到这个错误: Testcase: initializationError(Teste): Caused an ERROR org/hamcrest/SelfDescribing java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing at java.lang.ClassLoader.defineClass1(Native Met
Testcase: initializationError(Teste): Caused an ERROR
org/hamcrest/SelfDescribing
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
以下是文件的内容:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:./testeDB</property>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
</session-factory>
</hibernate-configuration>
<?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="HibernateAgoraVaiPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Pessoa</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:./testeDB"/>
<property name="javax.persistence.jdbc.user" value=""/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="dialect" value="org.hibernate.dialect.H2Dialect" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>
</persistence-unit>
</persistence>
Teste.java
import java.io.Serializable;
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.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Pessoa implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(length=50, nullable=false)
private String nome;
@Temporal(TemporalType.DATE)
private Date aniversario;
public Pessoa(){
}
public Date getAniversario() {
return this.aniversario;
}
public void setAniversario(Date aniversario) {
this.aniversario = aniversario;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
import java.util.Collection;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import org.junit.Test;
public class Teste {
private EntityManager em;
public Teste(){
this.em = Persistence.createEntityManagerFactory("TesteHibernatePU").createEntityManager();
}
@Test
public void inserir(){
// Instanciamos um objeto Pessoa, setando nome e data de nascimento
Pessoa p1 = new Pessoa();
p1.setNome("Jonnas Fonini");
p1.setAniversario(new Date());
Pessoa p2 = new Pessoa();
p2.setNome("Luana Fonini");
p2.setAniversario(new Date());
Pessoa p3 = new Pessoa();
p3.setNome("Fulano de Tal");
p3.setAniversario(new Date());
// Iniciamos a transação
em.getTransaction().begin();
// Aqui persistimos os objetos recém criados
em.persist(p1);
em.persist(p2);
em.persist(p3);
// E aqui efetuamos definitivamente a transação
em.getTransaction().commit();
}
@Test
public void listar(){
Collection <Pessoa> lista = em.createQuery("from Pessoa").getResultList();
for (Pessoa p : lista){
System.out.println(p.getId() + " – " + p.getNome() + " – " + p.getAniversario());
}
}
}
我认为可能是创建数据库文件的权限问题。我发现我的代码存在以下问题。尽管可能对任何人都有帮助: 1) 正如gauee所指出的,我应该下载hamcrest-core-1.3.jar并将其添加到测试库中 2) 在createEntityManagerFactory调用中,我传递了“TesteHibernatePU”。该名称必须与persistence.xml中使用的名称相同,在本例中为“HibernateAgoraVaiPU” 3) 另一个图书馆不见了。似乎是JUnit4.11及更高版本的依赖项。必须下载jandex-1.1.0.Final.jar并将其添加到测试库中
4) 最后,我不得不将Hibernate表策略创建从“创建”更改为“删除并创建”。我仍然不明白为什么我必须做出这样的改变。最初的迹象表明,类路径与hamcrest库之间似乎存在冲突。请验证在类路径上是否没有超过一个hamcrest库。您能告诉我怎么做吗?在库下,我确实找到了几个指向“Hibernate 4.3.x”和“Hibernate 4.3.x(JPA2.1)”的库,但是在删除带有“Hibernate 4.3.x”的库并尝试再次运行测试后,同样的错误继续发生。
sudo chmod 777 -R HibernateAgoraVai