web-dev-qa-db-fra.com

H2 simple et mise en veille prolongée / JPA

Test simple avec H2 comme base de données, JPA et Hibernate. Ne donne aucune erreur de discernement, mais ne persiste pas l'entité. Pour sûr, je manque quelque chose d'extrêmement simple

persistence.xml dans META-INF /:

<?xml version="1.0" encoding="UTF-8" ?>
<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="thePersistenceUnit" transaction-type="RESOURCE_LOCAL">
     <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>entities.Person</class>

    <properties>
        <property name="connection.driver_class" value="org.h2.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:h2:./db/repository"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true" />

    </properties>
</persistence-unit>

l'entité simple:

@Entity
public class Person {

    @Id
    @GeneratedValue
    private Integer id;
    private String firstName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
}

le test:

public class Testing {
    @Test
    public void test2(){

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("thePersistenceUnit");
        EntityManager theManager = factory.createEntityManager();
        assertNotNull(theManager);

        Person person = new Person();
        person.setFirstName("ana");
        theManager.persist(person);
        System.out.println(person.getId());

        Person p = (Person)theManager.find(Person.class, 1);
        System.out.println(person.getId());

        assertNotNull(p);
    }
}

le résultat :

Aug 16, 2013 1:48:20 PM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
Aug 16, 2013 1:48:20 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.0.1.Final}
Aug 16, 2013 1:48:20 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Aug 16, 2013 1:48:20 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000148: No JDBC Driver class was specified by property hibernate.connection.driver_class
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000006: Autocommit mode: true
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000401: using driver [null] at URL [jdbc:h2:./db/repository]
Aug 16, 2013 1:48:21 PM org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000046: Connection properties: {autocommit=true, release_mode=auto}
Aug 16, 2013 1:48:21 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Aug 16, 2013 1:48:21 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Aug 16, 2013 1:48:21 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
Aug 16, 2013 1:48:21 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Aug 16, 2013 1:48:21 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000227: Running hbm2ddl schema export
Aug 16, 2013 1:48:21 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: drop table Person if exists
Hibernate: create table Person (id integer generated by default as identity, firstName varchar(255), lastName varchar(255), primary key (id))
null
Hibernate: select person0_.id as id0_0_, person0_.firstName as firstName0_0_, person0_.lastName as lastName0_0_ from Person person0_ where person0_.id=?
null

junit.framework.AssertionFailedError
    at test.Testing.test2(Testing.Java:49)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)

La question: pourquoi ne persiste-t-elle pas l'instance/pourquoi ne lance-t-elle aucune erreur, etc.?

14
vlad dd

Vous essayez de conserver un enregistrement dans la base de données sans ouvrir de transaction. Ce n'est pas possible. Ce que vous devez faire, c'est:

    EntityManager theManager = factory.createEntityManager();
    theManager .getTransaction().begin();
    Person person = new Person();
    person.setFirstName("ana");
    theManager.persist(person);
    theManager.getTransaction().commit();
10