2013-08-16 20 views
11

Test semplice con H2 come database, JPA e Hibernate. Non dà errore di discernimento, ma non persiste l'entità. Di sicuro che mi manca qualcosa di estremamente sempliceSimple H2 and Hibernate/JPA

persistence.xml in 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> 

la semplice entità:

@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; 
    } 
} 

il 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); 
    } 
} 

il risultato:

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 domanda: Perché non persistono l'istanza/perché non si getta alcun errore, ecc?

+1

Si utilizza un percorso relativo quando si utilizza 'jdbc: h2: ./ db/repository' (relativo alla directory di lavoro corrente). Questo è un problema comune. Prova invece una directory assoluta: 'jdbc: h2:/data/db/repository', o relativa alla home directory dell'utente corrente:' jdbc: h2: ~/data/db/repository'. –

+1

Grazie, ci ho provato, nessun successo. MA, se metto il persist (..) all'interno di una transazione funziona e vedo la dichiarazione INSERT che viene generata. Persist non funzionerà al di fuori di una Transazione? Arresterà la sessione quando chiudo l'EM? –

+1

Stai ricevendo 'id' di' persona'. Sta dando "null". Non è stato impostato "id". – user2550754

risposta

9

Si sta tentando di mantenere un record nel database senza aprire una transazione. Non è possibile. Che cosa si dovrebbe fare è:

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