JPA kann Objekt nicht löschen

Goldfish

Bekanntes Mitglied
Hi, ich sitze nun seit diversen Stunden an einem Problem und weiß mir nicht mehr zu helfen. Ich habe noch nicht viel Erfahrung mit JPA, aber bin erstmals drauf umgestiegen, da es ja eigentlich Arbeit abnehmen sollte.. dabei wäre ich ohne vermutlich schon fertig -_-
Naja, ich habe eine sehr einfache Struktur, in der ich eine Entity persistiere, die mit ihrer Persistierung ein weiteres Objekt in einer anderen Tabelle speichert. Also CascadeType.PERSIST. Wenn ich das Objekt später wieder löschen will, klappt es nicht, wegen folgender Fehlermeldung:

Code:
java.lang.RuntimeException: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
	at de.gold.database.DatabaseManager.deleteEntityObject(DatabaseManager.java:71)
	at de.gold.database.DatabaseManagerTest._2_persistAdder(DatabaseManagerTest.java:97)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1338)
	at de.gold.database.DatabaseManager.deleteEntityObject(DatabaseManager.java:67)
	... 28 more
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211)
	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
	at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3400)
	at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3630)
	at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:114)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
	at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1335)
	... 29 more
Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no action; FK_3UNEX2ESC8THC4VPSXFJTW1M0 table: STRINGFIX_ADDER
	at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
	at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
	at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
	... 39 more
Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; FK_3UNEX2ESC8THC4VPSXFJTW1M0 table: STRINGFIX_ADDER
	at org.hsqldb.error.Error.error(Unknown Source)
	at org.hsqldb.StatementDML.performReferentialActions(Unknown Source)
	at org.hsqldb.StatementDML.delete(Unknown Source)
	at org.hsqldb.StatementDML.executeDeleteStatement(Unknown Source)
	at org.hsqldb.StatementDML.getResult(Unknown Source)
	at org.hsqldb.StatementDMQL.execute(Unknown Source)
	at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
	at org.hsqldb.Session.execute(Unknown Source)
	... 42 more

Meine Entities sind wie folgt definiert:

Code:
@Entity
public class StringFix {

    @Id
    private String hashcode;
    @NotNull
    private String match;
    private boolean isRegex;
    private boolean toUpper;
    private boolean toLower;
    ...

Code:
@Entity
public class Adder {

    @Id
    private String hashcode;

    @NotNull
    @OneToOne(orphanRemoval = true,  cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinTable(
            name="STRINGFIX_ADDER",
            joinColumns=
            @JoinColumn(name="STRINGFIX_HASH", referencedColumnName="HASHCODE", nullable = false, updatable = false),
            inverseJoinColumns=
            @JoinColumn(name="ADDER_HASH", referencedColumnName="HASHCODE", nullable = false, updatable = false))
    private StringFix regexMatch;
    @NotNull
    private String prefix;
    @NotNull
    private String suffix;

    @Transient
    private Pattern pattern;
    @Transient
    private String lastRegexMatch;
    @Transient
    private String runBy;
    @Transient
    private String ignored;

EDIT:

Hier noch meine Delete-Methode:

Code:
public <T> void deleteEntityObject(T entityObject) {
        EntityManager em = factory.createEntityManager();
        try {
            em.getTransaction().begin();
            Object entity = em.find(entityObject.getClass(), String.valueOf(entityObject.hashCode()));
            em.remove(entity);
            em.flush();
            em.getTransaction().commit();
        } catch (Throwable throwable) {
            em.getTransaction().rollback();
            throw new RuntimeException(throwable);
        } finally {
            em.close();
        }
    }
 
Zuletzt bearbeitet:

stg

Top Contributor
Du versuchst offenbar einen Eintrag aus der DB zu löschen, auf den von anderer Seite noch ein ForeignKey verweist.
 

Goldfish

Bekanntes Mitglied
ja tue ich. Aber was genau muss ich tun, damit er diesen einfach mit in die Tonne wirft? der Eintrag aus der Mapping-Tabelle soll ebenfalls gelöscht werden. Ich habs auch schon mit CascadeType.ALL versucht, aber das hilft auch nicht...
 

Goldfish

Bekanntes Mitglied
Hab wohl gerade die Lösung gefunden. Das was ich vorhabe, ist so nicht zu machen, nach folgendem Beitrag von StackOverflow
java - Deleting JPA object fails due to foreign key constraints? - Stack Overflow
Ich muss die entsprechende delete-Operation wohl selbst schreiben. Jetzt wo ich weiß, dass es wohl keinen anderen Weg gibt, ist das Problem wohl gelöst. Hatte die ganze Zeit angenommen, es würde einen sauberen Weg geben, der mir die Arbeit abnimmt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Hibernate: Objekt wird nicht gelöscht. Data Tier 5
S JPA Aus 1...n nur current Objekt Data Tier 4
R JPA - Objekt verändern Data Tier 10
R Ein Objekt mit einem String aus einem Set laden Data Tier 2
S Hibernate: Objekt aus Liste löschen Data Tier 3
T NamedQuery => Whore Objekt in Collection Data Tier 3
eSK Objekt löschen -> Ganze Tabelle gelöscht. Data Tier 6
J Umstieg von Wildfly 13->14, JPA 2.1->2.2, schreiben funktioniert nicht mehr Data Tier 10
O JPA Persistieren mit JTA funktioniert nicht Data Tier 0
R JSF Daten werden nicht aktualisiert aus Datenbank gelesen Data Tier 3
G Zuweisen von eigenen DB-Verbindungen nicht möglich Data Tier 3
M HibernateTemplate löscht nicht ohne flush() Data Tier 0
N JPA Änderungen werden nicht gespeichert Data Tier 2
S JPA Cascade: Entity nur speichern, wenn sie nicht schon existiert Data Tier 0
E JPA Session.delete einer Entity wird nicht ausgeführt Data Tier 2
Kenan89 9.2-1000 JDBC 4 nicht für Java EE ? Data Tier 3
neonfly <exclude-unlisted-classes>true</exclude-unlisted-classes> mag <class>package.Klasse</class> nicht Data Tier 2
K JPA One2Many-Set erkennt seine Inhalte nicht wieder Data Tier 3
D Hibernate Tabellen werden nicht mehr erstellt Data Tier 2
R Beim deployen und initialisieren der DB werden Umlaute nicht gespeichert Data Tier 5
B Datensatz wird nicht in DB geschrieben! Data Tier 2
N Löschen OneToMany Beziehung (delete-orphan) geht nicht Data Tier 2
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
Landei JPA - persist persisted nicht Data Tier 4
D jpa/eclipselink setMaxResults() funktioniert nicht mit MySql?! Data Tier 9
D jpa "pessimistic lock" funktioniert nicht?! Data Tier 11
A Fehlermeldung: Tabellen werden nicht gefunden Data Tier 2
L Hibernate - Tabelle nicht gemappt!? Data Tier 4
H Log4J loggt Hibernate nicht in Kombination mit Tomcat Data Tier 2
N Spring / OpenJPA Inheritance: Subklassen werden nicht erkannt Data Tier 4
D Daten werden nicht gespeichert mit Spring + JPA (Hibernate): Data Tier 6
W JPA Persistenz 2x hintereinander funktioniert nicht Data Tier 3
W JPA generiert die Tabellen bzw. die DDL Files nicht Data Tier 6
K Hibernate: OneToOne funktioniert nicht Data Tier 3
D Hibernate schreibt nicht in DB Data Tier 1
G Hibernate OneToMany und ManyToOne Objekte löschen Data Tier 13
A @ManyToMany - Kein Löschen bereits zugewiesener Entities Data Tier 6
F JPA + EclipseLink rekursive Beziehung löschen Data Tier 2
M EJBQL: Item aus einer Collection(ManyToOne) löschen Data Tier 7
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
T Hibernate: Löschen vor Speichern Data Tier 34
G Mit JPA Tabellen löschen Data Tier 8

Ähnliche Java Themen


Oben