2013-08-16 24 views
11

Einfacher Test mit H2 als Datenbank, JPA und Hibernate. Gibt keinen erkennenden Fehler, aber die Entität bleibt nicht erhalten. sicher Denn ich etwas extrem einfachEinfach H2 und Hibernate/JPA

persistence.xml in META-INF bin fehlt /:

<?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> 

die einfache Einheit:

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

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

das Ergebnis:

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) 

Die Frage: , warum es die Instanz nicht anhalten/warum es keinen Fehler werfen, etc?

+1

Sie einen relativen Pfad verwenden, wenn mit 'jdbc: h2: ./ db/repository' (relativ zum aktuellen Arbeitsverzeichnis). Dies ist ein häufiges Problem. Versuchen Sie stattdessen ein absolutes Verzeichnis: 'jdbc: h2:/data/db/repository' oder relativ zum aktuellen Benutzer-Ausgangsverzeichnis:' jdbc: h2: ~/data/db/repository'. –

+1

Danke, versuchte das, kein Erfolg. ABER, wenn ich die Persistenz (..) in eine Transaktion lege, funktioniert es und ich sehe die INSERT-Anweisung, die erzeugt wird. Persist wird außerhalb einer Transaktion nicht funktionieren? Wird es die Sitzung leeren, wenn ich die EM schließe? –

+1

Sie erhalten "ID" von "Person". Es gibt "null". Die ID ist nicht gesetzt. – user2550754

Antwort

9

Sie versuchen, einen Datensatz in der Datenbank beizubehalten, ohne eine Transaktion zu öffnen. Das ist nicht möglich. Was Sie tun sollten, ist:

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