JPA Problem mit Cascading

Dieses Thema JPA - Problem mit Cascading im Forum "Data Tier" wurde erstellt von saw, 5. Mai 2014.

Thema: Problem mit Cascading Hi, ich habe kein Problem mit Cascading bzw irgendwas mache ich falsch. Mein Verstaendnis von Cascading ist, dass...

  1. saw
    saw
    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:

    Code (Text):

    @Entity
    @DiscriminatorValue("typ1")
    public class AccountType1 extends Account {
       
        @ManyToMany(cascade=CascadeType.PERSIST)
        @ElementCollection(fetch=FetchType.LAZY)
        private Set<Tag> tags;
       
            ...
    Code (Text):
    @Entity
    public class Tag extends PersistentObject {
       
        private String value;

    Tag erzeugen und abspeichern:
    Code (Text):

    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 (Text):

    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: 5. Mai 2014
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. saw
    saw