[GAE] Leere JPA Ergebnisse

Orthak

Mitglied
Hallo zusammen,
ich arbeite gerade an einer simplen Google Appengine - Anwendung, die JPA 1 für die Persistenz nutzt. Leider bekomme ich in meinen UnitTests immer nur Leerergebnisse. Anbei ein paar Codeausschnitte:

Klasse User:
Code:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User implements IUser {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	// Logindata
	private String login, password;
	private String eMail;
...

Klasse UserDAO:
Code:
public class UserDAO implements IUserDAO {

	private EntityManager em;
	
	public UserDAO() {
		this.em = EMF.get().createEntityManager();
	}
	
	public void save(IUser user) {
		em.persist(user);
	}

	public IUser getById(long id) {
		//Query result = em.createQuery("SELECT u FROM User u WHERE u.id = :id ").
		//	setParameter("id", id);
		
		return (IUser)em.find(IUser.class, id);
	}
...

Und hier die Testmethode:
Code:
	@Test
	public void testSave() {
		IUser user = new User();
		user.setLogin("testUserDAO");
		userDAO.save(user);
		if(userDAO.getById(1l).getLogin().equals("testUserDAO"))
			assert(true);
		else
			assert(false);
	}

Der Test schlägt entsprechend mit einer NullPointerException fehl. Hat Jemand eine Idee was ich hier falsch mache?

P.S.: Die für lokale UnitTests notwendigen Jars sind eingebunden.
 

blindmind

Mitglied
Hi!

Ich bin selbst "Enterprise-Anfänger", aber ich würde folgendes versuchen.

Erzeuge das userDAO in Deiner Test-Methode, da der EntityManager dort ja im Konstruktor erzeugt wird.

Der EntityManager, bzw. dessen Lebenzyklus ist, sofern es keine Statefull Session-Bean ist, an die aktuelle Transaktion gebunden. Und sofern ich weiß, werden mit @Test annotierte Methoden innerhalb einer Transaktion durchgeführt, d.h. der aktive EntityManager wird nach der Beendigung dieser geschlossen. Aus diesem Grunde werden die JPA-Entitäten, die mit dem EM assoziert waren, in den Zustand detached übergehen, können in der Anwendung zwar weiter benutzt werden, aber die Interakrion mit dem EE ist nicht mehr möglich.

Ich hoffe ich erzähle hier keinen kompletten Unfug, aber ich denke das es so ist....
 

Orthak

Mitglied
Hallo blindmind,
ohne Transaktion geht es natürlich nicht. Danke fürs Hinweisen :). Für Interessierte hier das (funktionierende) DAO:

Code:
public class UserDAO implements IUserDAO {

	private EntityManager em;
	private EntityTransaction tx;
	
	public UserDAO() {
		this.em = EMF.get().createEntityManager();
		this.tx = em.getTransaction();
	}
	
	public void save(IUser user) {		
		tx.begin();
			em.persist(user);
		tx.commit();
	}
}