play framework Exception - field ..没有默认值

时间:2012-02-09 15:16:50

标签: java hibernate exception jpa playframework

运行我的Play框架小应用程序我得到以下异常:

  

...引起:java.sql.BatchUpdateException:字段'sentTO_id'   没有默认值......

浏览器中的错误播放是

  

发生PersistenceException:插入Mail_User(Mail_id,   sentBCC_id)值(?,?)

我有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;
    }

}

全栈

  

请求POST /邮件/创建

的内部服务器错误(500)      

执行异常(在{module:crud} /app/controllers/CRUD.java中   第152行)发生PersistenceException:插入Mail_User   (Mail_id,sentBCC_id)值(?,?)

     

play.exceptions.JavaExecutionException:插入Mail_User   (Mail_id,sentBCC_id)值(?,?)at   play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)at   Invocation.HTTP请求(播放!)引起:   javax.persistence.PersistenceException:插入Mail_User   (Mail_id,sentBCC_id)值(?,?)at   play.db.jpa.JPABase._save(JPABase.java:38)at   controllers.CRUD.create(CRUD.java:152)at   play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)     在play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)at   play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)     在   play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)     at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)... 1更多   引起:javax.persistence.PersistenceException:   org.hibernate.exception.GenericJDBCException:无法执行JDBC   批量更新   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)     在   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)     在   org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)     在   org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:798)     at play.db.jpa.JPABase._save(JPABase.java:35)... 7更多引起:   org.hibernate.exception.GenericJDBCException:无法执行JDBC   批量更新   org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)     在   org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)     在   org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)     在   org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)     在   org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)     在   org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)     在   org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)     在   org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1179)     在   org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)     在org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)at at   org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)     在   org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188)     在   org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345)     在   org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)     在org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)at   org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795)     ... 8更多引起:java.sql.BatchUpdateException:Field   'sentTO_id'没有默认值   com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2018)     在   com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1449)     在   org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)     在   org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)     ......还有20个

我一直在讨论这个错误已经有一段时间但是无法解决这个问题。 有人可以帮我理解为什么我会收到这个错误吗?

2 个答案:

答案 0 :(得分: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; 

答案 1 :(得分:3)

错误:“字段'sentTO_id'没有默认值” 可能是因为您更改了模型但没有重新创建数据库。

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