[openJPA] Problem mit Transaktion?

y0dA

Erfahrenes Mitglied
Technologien: EJB 3, WAS 7, openJPA 1.2.irgendwas (benutzen aber JPA Annotationen)

Tabellenstruktur:
Tabelle Verfahren - Felder(nur die relevanten): ID (PK), STATUS(FK) NULLABLE
Tabelle Verfahrenstatus - Felder(nur die relevanten): ID (PK), VERFAHREN (FK) NOT NULL, STATUS

Java Domain:
Java:
@Table(name = "verfahren")
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Verfahren {
..
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinColumn(name = "status", nullable = true)
	private Verfahrenstatus aktuellerStatus;

	@OneToMany(mappedBy = "verfahren", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }, fetch = FetchType.LAZY)
	private List<Verfahrenstatus> statusListe;
..
}

@Table(name = "verfahrenstatus")
@Entity
public class Verfahrenstatus {
..
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
	@JoinColumn(name = "verfahren", nullable = false)
	private Verfahren verfahren;
..
}

Weiters ist Verfahren nur die Vaterklasse div. Verfahrenimplementierungen (wurde in Java und in der Db umgesetzt, also die Vererbung).

Nun muss ich bei einem speziellen Fall bei einer Persistierung eines Verfahrens, nennen wir es VerfahrenA, innerhalb dergleichen Transaktion andere Verfahren updaten. Im Detail muss ich deren Status verändern.
Sprich der Code sieht ungefähr wie folgt aus(möchte nicht alles posten weil es den Rahmen sprengen würde):
Java:
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class Service {
..
	@Resource
	UserTransaction userTransaction;
..
public Verfahren saveOrUpdateVerfahren(VerfahrenA verfahrenA, Person person) {
 userTransaction.begin();
 verfahrenAFacade.create(verfahrenA);
 doForVerfahren(person);
 userTransaction.commit();
}

public List<Verfahren> doForVerfahren(Person person) {
 List<Verfahren> list = verfahrenFacade.loadAllVerfahrenForPerson(person)
 for (Verfahren verfahren : list) {
  Verfahrenstatus status = new Verfahrenstatus(new Date(),
  EnumVerfahren.ENTZOGEN, verfahren);
  verfahren.setAktuellerStatus(status);
  verfahrenFacade.update(verfahren)
 }
}

Also nochmal, ich hab ein VerfahrenA angelegt, bei selbigen muss ich prüfen ob dadurch andere Verfahren betroffen sind und falls dem so ist muss ich deren Status auf einen anderen Wert setzen. Das mache ich damit dass ich das Objekt verfahren (die Vaterklasse) update mit dem neuen Statuswert.

Das Problem:
Wenn bei der Iteration mehr als ein Verfahren vorkommt dann wird nur jenes Verfahren aktualisiert welches in der Iteration an der ersten Stelle steht, bei allen kommenden Verfahren wird der Status nicht verändert. Hat das etwas mit der Transaktion zu tun oder etwa ein Bug in openJPA?

**EDIT**
Also wenn ich die Transaktionsklammern weglasse
Java:
userTransaction.begin();
userTransaction.commit();

dann funktioniert alles, nur sollte halt alles in einer Transaktion passieren..
 

Neue Beiträge

Zurück