Java 在H2数据库不在netbeans中工作的情况下休眠

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

我无法用一个非常简单的代码让Hibernate在netbeans上使用H2数据库。请帮忙!我得到这个错误:

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