JPA Persistenz 2x hintereinander funktioniert nicht

Status
Nicht offen für weitere Antworten.

Waldi

Bekanntes Mitglied
Code:
public class StartKlasse 
{
	final EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("HalloWie");
	
	public static void main(String[] args) 
	{
		Mitarbeiter ma1 = new Mitarbeiter();
		ma1.setName("Name1");
		ma1.setVorname("VName1");

		Mitarbeiter ma2 = new Mitarbeiter();
		ma2.setName("Name2");
		ma2.setVorname("Vorname2");

		Collection <Projekt> cp1 = new ArrayList <Projekt>();
		Collection <Projekt> cp2 = new ArrayList <Projekt>();

		Projekt p1 = new Projekt();
		p1.setName("Projekt1");
		Projekt p2 = new Projekt();
		p2.setName("Projekt2");
		Projekt p3 = new Projekt();
		p3.setName("Projekt3");

		cp1.add(p1);
		cp1.add(p2);
		cp1.add(p3);
		
		cp2.add(p1);
		cp2.add(p2);
		cp2.add(p3);

		ma1.setProjekt(cp1);
		ma2.setProjekt(cp2);

		StartKlasse sk = new StartKlasse();
		sk.persist(ma1); <-------
		sk.persist(ma2);
		sk.ausgabe();
	}

	public void persist(Object object) 
	{
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
		try {
			em.persist(object);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			em.close();
		}
	}
	
	@SuppressWarnings("unchecked")
	public void ausgabe(){
		final EntityManager em = emf.createEntityManager();
		for (Iterator <Mitarbeiter> itma = em.createQuery("select m from Mitarbeiter m").getResultList().iterator();itma.hasNext();)
		{
			System.out.println(itma.next().getName());
			for (Iterator <Projekt> itp = itma.next().getProjekt().iterator();itp.hasNext();)
			{
				System.out.println( itp.next().getName());
			}
		}
		em.close();
	}
}

Hallo Hallo.

Da wo der <---- ist, ist das Problem. Das Problem hier ist: kommentier ich eines von beiden aus, funktioniert alles. Wenn ich beide persistieren lassen will kommt folgende exception.

Code:
javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.derby.client.am.BatchUpdateException: Fehler bei nicht atomarer Batch-Operation. Der Batch wurde übergeben. Bei einem Batch-Member ist jedoch mindestens eine Ausnahme eingetreten. Mit getNextException() können Sie die Ausnahmen für bestimmte Batch-Elemente abrufen.
Error Code: 20000
Query: DataModifyQuery()
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
	at de.xxxxx.xxxxxx.model.StartKlasse.persist(StartKlasse.java:57)
	at de.xxxxx.xxxxxx.model.StartKlasse.main(StartKlasse.java:47)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.apache.derby.client.am.BatchUpdateException: Fehler bei nicht atomarer Batch-Operation. Der Batch wurde übergeben. Bei einem Batch-Member ist jedoch mindestens eine Ausnahme eingetreten. Mit getNextException() können Sie die Ausnahmen für bestimmte Batch-Elemente abrufen.
Error Code: 20000
Query: DataModifyQuery()
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:313)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeJDK12BatchStatement(DatabaseAccessor.java:790)
	at org.eclipse.persistence.internal.databaseaccess.ParameterizedSQLBatchWritingMechanism.executeBatchedStatements(ParameterizedSQLBatchWritingMechanism.java:144)
	at org.eclipse.persistence.internal.databaseaccess.ParameterizedSQLBatchWritingMechanism.appendCall(ParameterizedSQLBatchWritingMechanism.java:88)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:534)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:500)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeCall(AbstractSession.java:855)
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:204)
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:190)
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:233)
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:213)
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.executeNoSelect(StatementQueryMechanism.java:116)
	at org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:66)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:666)
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:585)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2587)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1178)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1162)
	at org.eclipse.persistence.mappings.ManyToManyMapping.insertIntoRelationTable(ManyToManyMapping.java:831)
	at org.eclipse.persistence.mappings.ManyToManyMapping.performDataModificationEvent(ManyToManyMapping.java:989)
	at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:197)
	at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:3129)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1241)
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:478)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1330)
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:159)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1002)
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:84)
	... 3 more
Caused by: org.apache.derby.client.am.BatchUpdateException: Fehler bei nicht atomarer Batch-Operation. Der Batch wurde übergeben. Bei einem Batch-Member ist jedoch mindestens eine Ausnahme eingetreten. Mit getNextException() können Sie die Ausnahmen für bestimmte Batch-Elemente abrufen.
	at org.apache.derby.client.am.Agent.endBatchedReadChain(Unknown Source)
	at org.apache.derby.client.am.PreparedStatement.executeBatchRequestX(Unknown Source)
	at org.apache.derby.client.am.PreparedStatement.executeBatchX(Unknown Source)
	at org.apache.derby.client.am.PreparedStatement.executeBatch(Unknown Source)
	at org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.executeBatch(DatabasePlatform.java:1663)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeJDK12BatchStatement(DatabaseAccessor.java:777)
	... 29 more
Exception in thread "main" java.lang.IllegalStateException: 
Exception Description: No transaction is currently active
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.rollback(EntityTransactionImpl.java:122)
	at de.xxxxx.xxxxxx.model.StartKlasse.persist(StartKlasse.java:60)
	at de.xxxxx.xxxxxx.model.StartKlasse.main(StartKlasse.java:47)

Kann mir hier vielleicht einer weiterhelfen? Ich meine das kann doch nicht sein oder? Mit einem alleine klappt es und sobald 2 hintereinander ausgeführt werden knallt es.
 

Waldi

Bekanntes Mitglied
Code:
<?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="HalloWie" transaction-type="RESOURCE_LOCAL">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<mapping-file>META-INF/orm.xml</mapping-file>
		<class>de.xxxx.xxxxxx.model.Abteilung</class>
		<class>de.xxxx.xxxxxx.model.Ausbildung</class>
		<class>de.xxxx.xxxxxx.model.Branchen</class>
		<class>de.xxxx.xxxxxx.model.Einsatzbereiche</class>
		<class>de.xxxx.xxxxxx.model.Einsatzpunkt</class>
		<class>de.xxxx.xxxxxx.model.Einsatzschwerpunkte</class>
		<class>de.xxxx.xxxxxx.model.Fremdsprachen</class>
		<class>de.xxxx.xxxxxx.model.Gruppen</class>
		<class>de.xxxx.xxxxxx.model.Manager</class>
		<class>de.xxxx.xxxxxx.model.Mitarbeiter</class>
		<class>de.xxxx.xxxxxx.model.Projekt</class>
		<class>de.xxxx.xxxxxx.model.Rolle</class>
		<class>de.xxxx.xxxxxx.model.Score</class>
		<class>de.xxxx.xxxxxx.model.Skill</class>
		<class>de.xxxx.xxxxxx.model.Verfuegbarkeit</class>
		<properties>
			<property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
			<property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/test;create=true"/>
			<property name="eclipselink.jdbc.user" value="abc"/>
			<property name="eclipselink.jdbc.password" value="abc"/>
			<property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
			<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
			<property name="eclipselink.ddl-generation.output-mode" value="database"/>
			<property name="eclipselink.logging.level" value="OFF"/>
			<property name="eclipselink.logging.logger" value="JavaLogger"/>
		</properties>
	</persistence-unit>
</persistence>

ich weis nicht was du damit anfangen willst. Das Mapping wird bei mir in der ORM.xml gemacht. Ist es das was du benötigst?
 

Waldi

Bekanntes Mitglied
Code:
ma1.setProjekt(cp1);
		ma2.setProjekt(cp2);

		StartKlasse sk = new StartKlasse();
		sk.persist(ma1,ma2);
		sk.ausgabe();
	}

	public void persist(Object object, Object object2) 
	{
		EntityManager em = emf.createEntityManager();
		em.getTransaction().begin();
		try {
			em.persist(object);
			em.persist(object2);
			em.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			em.getTransaction().rollback();
		} finally {
			em.close();
		}
	}

So funktioniert es, also wenn alles in einer Transaktion gemacht wird. Aber warum?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben