错误插入元素(主键)

时间:2013-04-08 12:19:37

标签: java web-services jpa playframework playframework-1.x

我的播放框架配置有一个问题,当我插入一个新的Notification时,我收到了错误。我不知道为什么会出现这个错误。因为我扩展了Model类,Play必须为每一行生成一个新ID。

如果您可以告诉我这是什么问题,或者其他更好的方法,也许如果我扩展了GenericModel并且我执行了这样评论的代码:

// @Id
// @GeneratedValue(strategy = GenerationType.AUTO)
// public long id;

但如果我这样做,我该如何插入新行?

非常感谢!!!!


发现错误:

  

发生PersistenceException org.hibernate.HibernateException:数据库未返回本机生成的标识值

这是/app/controllers/WSConfiguracion.java

if (cliente.valorBateria < filasConfiguracionClientes.get(i).limiteBateria) {   
    if (!estadoNotificacion.hayNotiBateria) {

       // code below generated the error
       Notificacion notificacion = new Notificacion(
          filasConfiguracionClientes.get(i).imeiadmin,imei, "bateria baja"
       ).save();

       estadoNotificacion.hayNotiBateria = true;
       //notificacion.save();
       estadoNotificacion.save();
       renderText("NOTIFICA BATERIA");
    }
} else {
    ...
}

这是我的模特。

package models;
import javax.persistence.Entity;
import play.db.jpa.Model;

@Entity
public class Notificacion extends Model {
   //@Id
   //@GeneratedValue(strategy = GenerationType.AUTO)
   //public long id;

   //@Id
   public long imeiadmin;
   //@Id
   public long imeiclient;
   public String detalleNotificacion;

   public Notificacion(long imeiadmin, long imeiclient,String detalleNotificacion) {
      this.imeiadmin = imeiadmin;
      this.imeiclient = imeiclient;
      this.detalleNotificacion = detalleNotificacion;
   }
}

2 个答案:

答案 0 :(得分:1)

我认为错误:

  

发生PersistenceException org.hibernate.HibernateException:数据库未返回本机生成的标识值

发生了

,因为数据库中有无序列。如果您为模型扩展Model类并且处于开发模式,则Play!Framework会自动为您的数据库生成名为hibernate_sequence的序列。该序列用于为您的模型生成 ID 。您可以检查数据库以确保存在序列。

如果存在hibernate_sequence,您可以像以前一样插入数据:

Notificacion notificacion = new Notificacion(
      filasConfiguracionClientes.get(i).imeiadmin,imei, "bateria baja"
).save();

然后,应该解决上面的错误。


  

注意:

     
    

如果您使用 PostgreSQL 数据库,我指的是这个答案。如果您使用其他数据库,例如 MySQL ,则应在ID列上定义AUTO_INCREMENT作为序列定义。

  

更新 - 我已尝试过H2数据库设置

H2中使用application.conf数据库进行配置:

# Development mode
application.mode=dev
# Set simple file written database (H2 file stored)
db=fs
# JPA DDL update for development purpose only
jpa.ddl=update

控制器:

public static void test15878866() {
   // force to insert dummy data
   Notificacion notificacion = new Notificacion(
      1L, 2L, "This is new notificacion"
   ).save();

   renderText(notificacion.detalleNotificacion);
}

型号:

@Entity
public class Notificacion extends Model {
   public long imeiadmin;
   public long imeiclient;
   public String detalleNotificacion;

   public Notificacion(long imeiadmin, long imeiclient,String detalleNotificacion) {
      this.imeiadmin = imeiadmin;
      this.imeiclient = imeiclient;
      this.detalleNotificacion = detalleNotificacion;
   }
}

答案 1 :(得分:0)

我发现了错误!!我只需要在构造函数中添加 super(); 。 谢谢大家,iwawiwi。

型号:

@Entity
public class Notificacion extends Model {
public long imeiadmin;
public long imeiclient;
public String detalleNotificacion;

  public Notificacion(long imeiadmin, long imeiclient,String detalleNotificacion) {
  super();
  this.imeiadmin = imeiadmin;
  this.imeiclient = imeiclient;
  this.detalleNotificacion = detalleNotificacion;
  }
}