Entities und Relationen verursachen Exceptions - wie lösen?

Hallo,

ich versuche eine Entitie zu speichern erhalte jedoch immer eine Exception. Dabei handelt es sich um die Klasse Quantity welche unter anderem die Entities Ingredient und Measurement enthält. Diese haben jeweils eine OneToOne Relation.

Wird ein Objekt Quantity angelegt, dem Ingredient und Measurement zugewiesen werden sollen diese auch in der DB erstellt werden. Wird im Objekt Quantity Ingredient oder Measurement geändert, sollen diese beim speichern von Quantity ebenfalls aktualisiert werden. Wird das Objekt Quantity gelöscht sollen die dabei erstellten Objekte Quantity und Measurement erhalten bleiben, da diese später weiter verwendet werden können.

Ich habe die Relation deshalb wie folgt definiert.

@Table(name = "c_quantity")
public class Quantity implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    public Quantity() {
    }

    @OneToOne(cascade = {CascadeType.PERSIST,  CascadeType.REFRESH, CascadeType.MERGE} )
    private Ingredient Ingredient;

[...]
    private Integer amount;
    @OneToOne(cascade = {CascadeType.PERSIST,  CascadeType.REFRESH, CascadeType.MERGE} )
    private Measurement Measurement;```

Wenn ich nun folgendes mache:

Measurement gramm = new Measurement(“g”);

        Step s1 = new Step("Alle Zutaten beginnend mit dem Mehl vermischen. ");
        s1.setId(1L);
        Quantity qmehl = new Quantity();
        Ingredient mehl = new Ingredient("mehl");
        qmehl.setIngredient(mehl);
        qmehl.setMeasurement(gramm);
        qmehl.setAmount(10);

this.Recipe.getSteps().add(s1);
RecipeFacadeEM.create(Recipe); //Objekte in der DB erzeugen.


Davor habe ich alle Tabellen geleert. 

Wird folgende Exception geworfen:


WARNING: Setting non-serializable attribute value into ViewMap: (key: RecipeBean, value class: Get.Bean.RecipeBean)
WARNING: Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895)

at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:724)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
at sun.reflect.GeneratedConstructorAccessor231.newInstance(Unknown Source)

at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:885)
... 89 more

WARNING: DTX5014: Caught exception in beforeCompletion() callback:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:692)

at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:724)

Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
… 57 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
at sun.reflect.GeneratedConstructorAccessor231.newInstance(Unknown Source)

at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:885)
... 89 more

WARNING: EJB5184:A system exception occurred during an invocation on EJB RecipeFacade, method: public void Get.Facade.RecipeFacade.create(Get.Model.Recipe)
WARNING: javax.ejb.EJBException: Transaction aborted
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:725)
at java.lang.Thread.run(Thread.java:724)
Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:490)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:854)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:719)
… 53 more
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:692)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:170)
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:452)
… 55 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895)
… 57 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
at sun.reflect.GeneratedConstructorAccessor231.newInstance(Unknown Source)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)

at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:885)
... 89 more

WARNING: #{RecipeBean.save}: javax.ejb.EJBException: Transaction aborted
javax.faces.FacesException: #{RecipeBean.save}: javax.ejb.EJBException: Transaction aborted
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)

at java.lang.Thread.run(Thread.java:724)

Caused by: javax.faces.el.EvaluationException: javax.ejb.EJBException: Transaction aborted
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
… 34 more
Caused by: javax.ejb.EJBException: Transaction aborted
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:725)

at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
... 35 more

Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:490)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:854)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:719)
… 53 more
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1.handleException(EntityManagerSetupImpl.java:692)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:170)
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:452)
… 55 more
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’
Error Code: 1054
Call: INSERT INTO c_quantity (ID, AMOUNT, INGREDIENT_NAME, MEASUREMENT_NAME) VALUES (?, ?, ?, ?)
bind => [4 parameters bound]
Query: InsertObjectQuery(GTS.Model.Quantity[ id=501 ])
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:957)

... 57 more

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘INGREDIENT_NAME’ in ‘field list’

... 89 more


Was meint der mit Unknown column 'INGREDIENT_NAME' in 'field list'?

Nach dem RecipeFacadeEM.create(Recipe); hat er in der DB ein INGREDIENT mit mehl und ein measurement mit g angelegt. Quantity und die restlichen Tabellen bleiben leer.

Kann mir jemand weiterhelfen?

*** Edit ***

*** Edit ***

*** Edit ***

Hallo,

nach mehreren Stunden herum probieren konnte ich den Fehler finden. Als ich testweise die DB aus den Entities noch einmal generieren lies fiehl mir folgender Fehler auf:

 Got SQLException executing statement "CREATE TABLE c_recipe_c_category (Recipe_NAME VARCHAR(255) NOT NULL, Categories_NAME VARCHAR(255) NOT NULL, PRIMARY KEY (Recipe_NAME, Categories_NAME))": com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 1000 

Ich habe dann die Länge des varchar mit @Column(length = 150) begrenzt und die DB nocheinmal generieren lassen und siehe da, das Rezept wurde ohne Exception erfolgreich erstellt.

Ein fieser Fehler.