0

次のエラーが表示されます。

" NullPointerException: null ソースがありません。例外スタック トレースは次のとおりです。

->java.lang.NullPointerException:

 com.avaje.ebean.Ebean.save(Ebean.java:585)" 

「データベース 'default' は進化が必要です!」という最初のページで [このスクリプトを今すぐ適用] をクリックした後。

Usuario が親テーブルで、Operator が子テーブルである単一のテーブル継承 (ebean でサポートされている唯一のもの) があります。

私は次のモデルを持っています:

@Entity
@Table(name="usuario")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("usuario")
public class Usuario {
    @Id
    public Long id;

    @Constraints.Required
    public String username;

    @Constraints.Required
    public String password;

    @Constraints.Required
    public String nombre;

    @Constraints.Required
    public String apellido;

    @Constraints.Required
    @Constraints.Email
    public String email;
}

@Entity
@DiscriminatorValue("operador")
public class Operador extends Usuario {
    @Formats.DateTime(pattern = "dd/mm/yyyy hh:mm:ss")
    public Date ultimaSesion;
}

これは、Usuario のテーブル定義です (/conf/evolutions/defaults/1.sql で定義):

# --- !Ups
create table usuario (
  id serial,
  DTYPE varchar(10) not null,
  nombre varchar(30) not null,
  apellido varchar(35) not null,
  username varchar(30) not null,
  password varchar(255) not null,
  email varchar(255) not null,
  ultima_sesion timestamp,
  constraint pk_usuario primary key (id)
);

ご覧のとおり、Usuario テーブルには DTYPE と ultima_session があります (これは Operador クラスに継承されます)。

これが initial-data.yml です。

usuario:
    - !!models.Usuario
        username: usuario1
        password: usuario1pass
        nombre: NombreUsuario1
        apellido: ApellidoUsuario1
        email: email@usuario1.com

    - !!models.Operador
        username: usuario2
        password: usuario2pass
        nombre: NombreUsuario2
        apellido: ApellidoUsuario2
        email: email@usuario2.com
        ultimaSesion: 2013-06-15T17:18:23.18-06:00

    - !!models.Usuario
        username: usuario2
        password: usuario2pass
        nombre: NombreUsuario3
        apellido: ApellidoUsuario2
        email: email@usuario3.com

次のように、/app に格納されているグローバル クラスを使用して初期データを読み込みます。

public class Global extends GlobalSettings {
    public void onStart(Application app) {
        InitialData.insert(app);
    }

    static class InitialData {
        public static void insert(Application app) {
            if(Ebean.find(Usuario.class).findRowCount() == 0) {
                Map<String, List<Object>> usuario = (Map<String, List<Object>>) Yaml.load("initial-data.yml");
                Ebean.save(usuario.get("usuario"));
            }
        }

    }
}

間違いがどこにあるのかわかりません。たぶん、initial-data.yml で Operador をインスタンス化しようとしている方法ですか? Usuario のサブクラスなので !!models.Operador でいいと思います。

ご協力いただきありがとうございます。

4

0 に答える 0