# Spring, JPA, Hibernate, H2



## mvitz (26. Nov 2009)

Hallo zusammen,

um für mich kleinere Snippets zusammen zu stellen, versuche ich mich gerade an JPA per Spring. Hibernate soll hierzu als Provider dienen und als DB soll H2 herhalten. Soweit scheint auch alles zu klappen, meine Entity wird von Hibernate in die Datenbank gespeichert und kann auch bei einem erneuten Start dort heraus geholt werden, ABER öffne ich die Datenbank per SquirrelSQL finde ich dort weder die erzeugte Tabelle noch irgendwas, was mich in dieser Richtung weiterbringen würde...

Hier mal sämtlich Projektsachen:


```
package de.mvitz.examples.spring.jpa;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class MyEntity {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    private String value;

    public MyEntity() {
    }

    public MyEntity(final String value) {
        this.value = value;
    }

    public Long getId() {
        return id;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return String.format("%d: %s", id, value);
    }

}
```


```
package de.mvitz.examples.spring.jpa;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository("service")
@Transactional
public class Service {

    @PersistenceContext
    private EntityManager em;

    public void setEntityManager(EntityManager entityManager) {
        this.em = entityManager;
    }

    public MyEntity createEntity(String value) {
        MyEntity e = new MyEntity(value);
        em.persist(e);
        return e;
    }

    public MyEntity getEntityForId(long id) {
        MyEntity e = em.find(MyEntity.class, id);
        return e;
    }

}
```


```
package de.mvitz.examples.spring.jpa;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("jpa-spring.xml");

        Service service = (Service) ctx.getBean("service");

        MyEntity e1 = service.createEntity("test");
        System.out.println("Created entity: " + e1);

        long id = 1;
        MyEntity e2 = service.getEntityForId(id);
        System.out.println("Retrieved entity: " + e2);
    }

}
```

[XML]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd Index of /schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd Index of /schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:load-time-weaver />
    <context:annotation-config />
    <context:component-scan base-package="de.mvitz.examples.spring.jpa" />

    <tx:annotation-driven />

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--        <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />-->
<!--        <property name="url" value="jdbc:derby://localhost:1527/spring-jpa-test;create=true" />-->
        <property name="driverClassName" value="org.h2.Driver" />
        <property name="url" value="jdbc:h2:~/h2-test;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=2" />
        <property name="username" value="admin" />
        <property name="password" value="secret" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false" />
                <property name="generateDdl" value="true" />
<!--                <property name="database" value="DERBY" />-->
                <property name="database" value="H2" />
            </bean>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
        </property>
    </bean>

</beans>[/XML]

[XML]<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="test" />
</persistence>[/XML]


----------



## robertpic71 (30. Nov 2009)

Versuche einmal eine festen Pfad bei H2 mit zugeben, also:

jdbc:h2:file:C:/dir/h2-test

~ sollte im Userverzeichnis landen, wer weiß...

Schalte außerdem einmal die SQL-Anzeige ein:
<property name="showSql" value="false" />        >>>> true

Damit solltest du sehen, ob der INSERT Statements erzeugt. Schreibt er sonst irgendwelche Fehlermeldungen?

/Robert


----------



## mvitz (30. Nov 2009)

ARGH...

auch wenn du in diesem Falle nicht direkt beigetragen hast, klappt es nun ^^

Folgender Fehler in Squirrel war als H2 Treiber noch die Version h2-1.1.108.jar drinne, in meiner Spring App jedoch die Version h2-1.2.124.jar ...

Nach ändern der Treiberversion in Squirrel funktioniert nun alles...

Trotzdem vielen lieben dank!


----------

