# Datasource Problem



## Gelöschtes Mitglied 5909 (28. Nov 2008)

Zur Zeit hänge ich an einem Problem das ich nicht ganz versteh:

Ich verwende innerhalb von Glassfish OpenJPA da OpenJPA h2 unterstützt und ich diese db gerne verwenden würde (sind auch schon einige Daten drinn, die ich nur ungern neu eingebe).

Er Versucht ständig den org.h2.Driver in eine Datasource zu Casten, was natürlich um die Ohren fliegt.

Meine Konfiguration:

*persistence.xml*


```
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">
  <persistence-unit name="webshop">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>h2db</jta-data-source>
    <class>de.mas.ejb.persistence.Article</class>
    <class>de.mas.ejb.persistence.Tag</class>
    <class>de.mas.ejb.persistence.Category</class>
    <class>de.mas.ejb.persistence.User</class>
    <class>de.mas.ejb.persistence.Person</class>
    <class>de.mas.ejb.persistence.Order</class>
    <properties>
      <property name="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.H2Dictionary"/>
      <property name="openjpa.ConnectionURL" value="jdbc:h2:tcp://localhost/db/data"/>
      <property name="openjpa.ConnectionDriverName" value="org.h2.Driver"/>
      <property name="openjpa.ConnectionUserName" value="sa"/>
      <property name="openjpa.ConnectionPassword" value="sa"/>
      <property name="openjpa.NontransactionalWrite" value="false"/>
      <property name="openjpa.Log" value="DefaultLevel=TRACE,Tool=TRACE"/>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>
</persistence>
```


*sun-resources.xml*


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="h2db" object-type="user" pool-name="jdbc_h2_tcp_localhost_db_dataPool"/>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" 
connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" 
connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.h2.Driver"
 fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true"
 lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0"
 max-pool-size="32" max-wait-time-in-millis="60000" name="jdbc_h2_tcp_localhost_db_dataPool" non-transactional-connections="false" 
pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" 
steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="User" value="SA"/>
    <property name="Password" value="sa"/>
    <property name="URL" value="jdbc:h2:tcp://localhost/db/data"/>
    <property name="driverClass" value="org.h2.Driver"/>
  </jdbc-connection-pool>
</resources>
```


ejb-konfiguration in der *web.xml*


```
<ejb-local-ref>
        <ejb-ref-name>browse</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home/>
        <local>de.mas.ejb.session.BrowseLocal</local>
        <ejb-link>de.mas.ejb.session.Browse</ejb-link>
    </ejb-local-ref>
    <ejb-local-ref>
        <ejb-ref-name>cart</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home/>
        <local>de.mas.ejb.session.ShoppingCartLocal</local>
        <ejb-link>de.mas.ejb.session.ShoppingCart</ejb-link>
    </ejb-local-ref>
    <ejb-local-ref>
        <ejb-ref-name>userManager</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>


        <local-home/>
        <local>de.mas.ejb.session.UserManagerLocal</local>
        <ejb-link>de.mas.ejb.session.UserManager</ejb-link>
    </ejb-local-ref>
```


hier habe ich was ähliches gefunden:
http://www.marciowb.net/blog/2008/08/quickly-using-h2-database-with

aber wenn ich Toplink verwende dann muss ich meine Entities wieder ändern so wie es aussieht und meine Daten sind warscheinlich unbrauchbar.

Die h2 Datenbank starte ich manuell und sie ist auch auf jeden fall aktiv.

Die ganze Exception:



> 1066531  webshop  TRACE  [httpSSLWorkerThread-8084-0] openjpa.MetaData - "de.mas.ejb.persistence.Order" has mapping strategy "full".
> 1066531  webshop  TRACE  [httpSSLWorkerThread-8084-0] openjpa.MetaData - 	Resolving field "de.mas.ejb.persistence.Order@4115458.article".
> 1066531  webshop  TRACE  [httpSSLWorkerThread-8084-0] openjpa.MetaData - 	"article" has mapping strategy "org.apache.openjpa.jdbc.meta.strats.RelationFieldStrategy".
> 1066531  webshop  TRACE  [httpSSLWorkerThread-8084-0] openjpa.MetaData - 	Resolving field "de.mas.ejb.persistence.Order@4115458.user".
> ...



Ich habe oben Extra noch ein bischen von JPA Trace mit angehängt, weil es so aussieht als würde er schon auf die Datenbank zugreifen und die Entities auflösen und dann knallst...

Ich hoffe mir kann jemand helfen, besten Dank im vorraus.


----------



## Gelöschtes Mitglied 5909 (28. Nov 2008)

Oh Mann bin ich blind...

datasource-classname="org.h2.jdbcx.JdbcDataSource"
res-type="org.h2.jdbcx.JdbcDataSource" 


in der sun-resources.xml und es geht.

Jetzt hab ich schon ein weiteres Problem:

Der Container verwaltet jetzt automatisch für mich die Transationen und schon gibts n Problem:



> javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaktion für Zurücksetzung markiert.
> at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3798)
> at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
> at com.sun.ejb.containers.StatefulSessionContainer.postInvokeTx(StatefulSessionContainer.java:2714)
> ...



CartServlet:


```
if (cart.getUser() != null) {
                    sucess = cart.purchase();                    
                }
```

Cart-EJB:


```
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ShoppingCart implements ShoppingCartLocal, Serializable {

    @PersistenceContext(unitName="webshop")
    private EntityManager   entityManager;

// ...
    public boolean purchase() {
        try {
            User found = entityManager.find(User.class, this.user.getId());
            if (found == null) return false;
            for (Order order : orders) {
                order.setUser(found);
                entityManager.persist(order);
            }
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
```

// EDIT

Problem gelöst merge statt persist, komisch nur dass es vorher ging


----------

