次のエラーが表示されます。
" 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 でいいと思います。
ご協力いただきありがとうございます。