Mai 21 2008

EJB Again

Ich habe wieder einmal feststellen müssen, das man wahrhaftig viel Zeit mit Enterprise JavaBeans verscheißen kann. Ich hab mir nur eine kleine TestBean gebaut (inzwischen ist es schon ein bisschen mehr), die einen Kunden persistieren soll, bzw. aktualisieren falls dieser schon existiert. Der erste Versuch war wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public Long addCustomer( String userName, String password, String firstName, String lastName, String emailAddress )
{
    Customer customer = new Customer( userName, password, firstName, lastName, emailAddress );

    try {
        entityManager.persist( customer );
    } catch ( EntityExistsException eee ) {
        String sQuery = "select c from " + Customer.class.getSimpleName() + " c where c.userName = :userName";
        Query cQuery = entityManager.createQuery( sQuery );
        cQuery.setParameter( "userName", userName );
        customer = (Customer) cQuery.getSingleResult();
    }
    return customer.getId();
}

Damit bekam ich aber dauernd eine Invalid Transaction Exception (ich hab mir nicht gemerkt wie die blöde Exception genau geheißen hat), wenn der Kunde bereits persistent ist.

Das Problem ist, dass eine EntityExistsException die aktuelle Transaction zum rollbacken markiert, und diese daher nicht mehr gültig ist. Wenn man das Ganze umdreht funktioniert’s auf wundersame Weise auf einmal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Long addCustomer( String userName, String password, String firstName, String lastName, String emailAddress )
{
    Customer customer;

    try {
        String sQuery = "select c from " + Customer.class.getSimpleName() + " c where c.userName = :userName";
        Query cQuery = entityManager.createQuery( sQuery );
        cQuery.setParameter( "userName", userName );
        customer = (Customer) cQuery.getSingleResult();

        /* update fields*/
        entityManager.merge( customer );
    } catch( NoResultException nre ) {
        customer = new Customer( userName, password, firstName, lastName, emailAddress );
        entityManager.persist( customer );
    }
    return customer.getId();
}