2012-02-09 36 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是旧模型中的必填字段。