2012-02-09 104 views
0

我似乎无法弄清楚什么是错的。
当使用次框架CRUD模块将信息插入DB(MySQL的)
(我使用如在http://www.playframework.org/documentation/1.0.1/crud所示的默认模块插入机构)
我收到以下异常播放框架“无法插入”异常

的PersistenceException发生: 有机.hibernate.exception.GenericJDBCException:无法插入: [models.Mail]

在{模块:污物} /app/controllers/CRUD.java(围绕线152)

   } catch (TemplateNotFoundException e) { 
       render("CRUD/blank.html", type, object); 
      } 

      } 

    Here -> object._save(); 
      flash.success(play.i18n.Messages.get("crud.created", type.modelName)); 
     if (params.get("_save") != null) { 
      redirect(request.controller + ".list"); 
      } 
      if (params.get("_saveAndAddAnother") != null) { 

     redirect(req 

uest.controller + ".blank"); 

这是我的邮件实体类:

@Entity 
public class Mail extends Model { 


    public String title; 

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


    public String content; 

    @ManyToOne 
    public User author; 

    public Mail(User author, ...){ 

     //more code here 
    } 

} 

控制器

package controllers; 

/** 
* 
* @author mike 
*/ 
public class Mails extends CRUD{ 

} 

[叠满]

执行异常(在{模块:污物} /应用/controllers/CRUD.java line 152)PersistenceExcepti在发生: org.hibernate.exception.GenericJDBCException:无法插入: [models.Mail]

play.exceptions.JavaExecutionException: org.hibernate.exception.GenericJDBCException:无法插入: [models.Mail ]在 play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)在 Invocation.HTTP请求(玩!)产生的原因: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:无法插入: [models.Mail] at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) a吨 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153) 在 org.hibernate.ejb.AbstractEntityManagerImpl.persist( AbstractEntityManagerImpl.java:678) at play.db.jpa.JPABase._save(JPABase.java:25)at controllers.CRUD.create(CRUD.java:152)at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker。的java:548) 在play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)在 play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478) 在 play.mvc.ActionInvoker.invokeControllerMeth od(ActionInvoker.java:473) at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)... 1更多 引起:org.hibernate.exception.GenericJDBCException:不能 插入:[models.Mail ]在 org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) 在 org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractReturningDelegate。performInsert(AbstractReturningDelegate.java:64) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852) 在 org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) 在org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)在 org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate (AbstractSaveEventListener.java:320) 在 org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) 在 org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) 在 org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69) 在 org.hibernate.event.def .DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179) 在 org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) 在 org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java :61) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782 ) org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672) ... 8 more引起来自:java.sql。 SQLException:字段'isAdmin'不具有默认值 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO。的java:2140)在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)在 com.mysql.jdbc.Prepar edStatement.executeInternal(PreparedStatement.java:2111) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310) 在 org.hibernate.id.IdentityGenerator $ GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) 在 org.hibernate.id.insert.AbstractReturningDelegate .performInsert(AbstractReturningDelegate.java:57) ...... 23多个

有什么想法?

+1

你有扩展你的控制器与播放 – basav 2012-02-09 12:11:11

+1

给予CRUD控制器你能复制错误的整个stacktrace? – romaintaz 2012-02-09 12:20:55

+0

增加了控制器和完整的堆栈,你可以看到它扩展了CRUD类。 – james 2012-02-09 12:26:22

回答

4

看到实际的原因

Caused by: java.sql.SQLException: Field 'isAdmin' doesn't have a default value 

看起来像你想保存到一个行没有设定isAdmin属性(也未在模型中定义,但可能对你实际的数据库?) 。

+0

你是对的,它是旧的模型类,我从类中删除了'IsAdmin'字段,但没有意识到hibernate不会从数据库表中删除字段。任何时候我做野外调整我应该去改变它们在数据库中? – james 2012-02-09 13:02:10

+1

@james,这取决于。你可以让Play!管理数据库更新('application.conf'中的'jpa.ddl'属性)。看到这里:http://www.playframework.org/documentation/1.2.3/configuration#jpa.ddl – romaintaz 2012-02-09 13:05:08

+0

谢谢!这将在研究框架和玩耍时节省大量时间。 – james 2012-02-09 13:50:36

1

那么寻找到你的POJO类,你有没有stetted您联系属性,因此

Hibernate无法找到管理员根在那里可以添加值。示例如下。

@javax.persistence.Entity 
    @Table(name = "Spring_Login") 
    public class Table_Login implements Serializable { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     @Column(name = "id") 
     private int id; 
} 

,然后SQL语法不会是失败和 那么SQL查询将是相同的,你的错误将得到解决。