Hi, ich habe kein Problem mit Cascading bzw irgendwas mache ich falsch. Mein Verstaendnis von Cascading ist, dass man eine Entity in einer Collection einer anderen Entity haengt und dann sein persist auf die letzter macht. Erstere sollte automatisch auch gespeichert werden - aber irgendwas muss ich wohl falsch machen:
Tag erzeugen und abspeichern:
Als Ergebnis des ganzen bekomme ich
Ich kann es zwar aus der Fehlermeldung nicht richtig rauslesen, aber ich vermute, dass es daran liegt, dass der Tag keine id hat und der dann in der Tabelle AccountType1_Tag einen leeren String versucht zu schreiben.
Wie macht man das richtig? Der Punkt ist, dass ich keine eigene Methode anbieten will um einen Tag anzulegen, sondern dieser immer im Zusammenhang mit einer anderen Entity erzeugt werden muss. Also erst ein persist auf den Tag und dann auf den AccountType1 ist keine Option.
Gruesse
saw
Code:
@Entity
@DiscriminatorValue("typ1")
public class AccountType1 extends Account {
@ManyToMany(cascade=CascadeType.PERSIST)
@ElementCollection(fetch=FetchType.LAZY)
private Set<Tag> tags;
...
Code:
@Entity
public class Tag extends PersistentObject {
private String value;
Tag erzeugen und abspeichern:
Code:
EntityManager em = Persistence.createEntityManagerFactory("trainingbroker").createEntityManager();
Tag tag = new Tag():
tag.setValue("some value");
AccountType1 account = DAO.getAccountById(id);
account.getTags().add(tag);
em.getTransaction().begin();
em.persist(account);
em.getTransaction().commit();
Als Ergebnis des ganzen bekomme ich
Code:
May 05, 2014 10:22:11 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1452, SQLState: 23000
May 05, 2014 10:22:11 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Cannot add or update a child row: a foreign key constraint fails
...
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`broker`.`AccountType1_Tag`, CONSTRAINT `FK_4mgh05pk0sxra0m6agwqmcy23` FOREIGN KEY (`tags_id`) REFERENCES `Tag` (`id`))
...
javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
Ich kann es zwar aus der Fehlermeldung nicht richtig rauslesen, aber ich vermute, dass es daran liegt, dass der Tag keine id hat und der dann in der Tabelle AccountType1_Tag einen leeren String versucht zu schreiben.
Wie macht man das richtig? Der Punkt ist, dass ich keine eigene Methode anbieten will um einen Tag anzulegen, sondern dieser immer im Zusammenhang mit einer anderen Entity erzeugt werden muss. Also erst ein persist auf den Tag und dann auf den AccountType1 ist keine Option.
Gruesse
saw
Zuletzt bearbeitet: