2012-02-09 74 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查詢將是相同的,你的錯誤將得到解決。