2012-02-09 38 views
3

運行我的劇本框架小的應用程序,我得到以下異常:發揮框架例外 - 場..沒有默認值

... Caused by: java.sql.BatchUpdateException: Field 'sentTO_id' doesn't have a default value ...

錯誤打法在瀏覽器中吐出來的是

PersistenceException occured : insert into Mail_User (Mail_id, sentBCC_id) values (?, ?)

我有2個實體的郵件和用戶

1)Mail.java

@Entity 
public class Mail extends Model { 


    public String title; 

    public Date sentAt; 
    @OneToMany 
    public List<User> sentTO; 
    @OneToMany 
    public List<User> sentBCC; 


    public String content; 

    @ManyToOne 
    public User author; 

//more code ... 
} 

2)User.java

@Entity 
public class User extends Model { 

    public String email; 
    public String password; 
    public String fullname; 
    public boolean isAdmin; 

    @OneToMany(mappedBy="author", cascade= CascadeType.ALL) 
    public List<Mail> mails ; 

    public User(String email, String password, String fullname) { 
     this.email = email; 
     this.password = password; 
     this.fullname = fullname; 
    } 

} 

完整的堆棧

Internal Server Error (500) for request POST /mails/create

Execution exception (In {module:crud}/app/controllers/CRUD.java around line 152) PersistenceException occured : insert into Mail_User (Mail_id, sentBCC_id) values (?, ?)

play.exceptions.JavaExecutionException: insert into Mail_User (Mail_id, sentBCC_id) values (?, ?) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231) at Invocation.HTTP Request(Play!) Caused by: javax.persistence.PersistenceException: insert into Mail_User (Mail_id, sentBCC_id) values (?, ?) at play.db.jpa.JPABase._save(JPABase.java:38) at controllers.CRUD.create(CRUD.java:152) at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502) at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478) at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) ... 1 more Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:798) at play.db.jpa.JPABase._save(JPABase.java:35) ... 7 more Caused by: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244) at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1179) at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795) ... 8 more Caused by: java.sql.BatchUpdateException: Field 'sentTO_id' doesn't have a default value at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2018) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1449) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 20 more

我一直在抓我的頭在這個錯誤了一段時間,但現在不能工作了。 有人能幫我理解爲什麼我得到這個錯誤嗎?

回答

4

首先,sendTosendBCC應映射爲@ManyToMany。其次,默認情況下,使用連接表實現@OneToMany映射和所有@ManyToMany映射,並且連接表名的默認生成策略不允許您在相同類之間具有多個此類關係。

你需要明確指定連接表名稱:

@ManyToMany 
@JoinTable(name = "User_Mail_To") 
public List<User> sentTO; 

@ManyToMany 
@JoinTable(name = "User_Mail_Bcc") 
public List<User> sentBCC; 
+0

謝謝你澄清錯誤,有一件事我不明白 - 爲什麼ManyToMAny?它是一個郵件連接到許多收件人?我錯過了什麼? (對不起,初學者問題) – james 2012-02-09 15:37:17

+1

@james:我想很多郵件也可以連接到單個收件人,因此多對多。 – axtavt 2012-02-09 15:47:28

2

的錯誤:「字段‘sentTO_id’沒有缺省值」 可能是由你改變了你的模型,但沒造成的事實不會重新創建您的數據庫。

sentTO_id是舊模型中的必填字段。