現在、私のアプリケーションの再生を2.4.xから2.5.18にアップグレードしています。私はplay-ebeanを1.0.0から3.2.0にアップグレードしました。これはebean 10.4.xを使用しています。私はH2データベースにBeanを挿入するたびにアップグレードした後、それがこのエラーを与える:再生2.4から2.5へのアップグレード後、EbeanがIdを生成しない
[DataIntegrityException: Error[NULL not allowed for column "ID"; SQL statement: insert into users (email, name, first_name, last_name, last_login, active, email_validated) values (?,?,?,?,?,?,?) [23502-185]]]
ebeanが新たに挿入されたBeanのIDを生成していないようです。保存する前にidを手動で設定するとエラーが発生しません(user.id = 123
)。しかし、私は本当にIDの生成を再び働かせたい。
バージョン:
- プレイ2.5.18
- プレイebean 3.2.0
- H2データベース1.4.185
- デッドボルト2.5.6
- のJava 1.8.0アップデート151
In plugins.sbt
application.confebean.default = ["models.*"]
で
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.2.0")
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean).settings(libraryDependencies ++= appDependencies)
libraryDependencies ++= Seq(
javaCore,
javaJdbc,
cache,
evolutions,
javaWs
)
これは、ユーザの情報を格納するモデルです。デッドボルトのSubjectも実装しています。私はモデルでセーブをオーバーライドしていないことを四倍にチェックしました。
package models;
...
@Entity
@Table(name = "users")
public class User extends AppModel implements Subject {
private static final long serialVersionUID = 1L;
@Id
public Long id;
@Constraints.Email
public String email;
public String name;
public String firstName;
public String lastName;
@Formats.DateTime(pattern = "yyyy-MM-dd HH:mm:ss")
public Date lastLogin;
public boolean active;
public boolean emailValidated;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
public List<Mapping> mappings;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
public List<DbConn> dbconns;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
public List<OntoFile> ontofiles;
@ManyToMany
public List<SecurityRole> roles;
@OneToMany(cascade = CascadeType.ALL)
public List<LinkedAccount> linkedAccounts;
@ManyToMany
public List<UserPermission> permissions;
public static final Finder<Long, User> find = new Finder<Long, User>(User.class);
...
public static User create(final AuthUser authUser) {
final User user = new User();
user.roles = Collections.singletonList(SecurityRole
.findByRoleName(controllers.Application.USER_ROLE));
user.active = true;
user.lastLogin = new Date();
user.linkedAccounts = Collections.singletonList(LinkedAccount
.create(authUser));
if (authUser instanceof EmailIdentity) {
final EmailIdentity identity = (EmailIdentity) authUser;
user.email = identity.getEmail();
user.emailValidated = false;
}
if (authUser instanceof NameIdentity) {
final NameIdentity identity = (NameIdentity) authUser;
final String name = identity.getName();
if (name != null) {
user.name = name;
}
}
if (authUser instanceof FirstLastNameIdentity) {
final FirstLastNameIdentity identity = (FirstLastNameIdentity) authUser;
final String firstName = identity.getFirstName();
final String lastName = identity.getLastName();
if (firstName != null) {
user.firstName = firstName;
}
if (lastName != null) {
user.lastName = lastName;
}
}
user.save(); // error happens here
Ebean.save(user); // this does not work either
return user;
}
...
}
これが存在する理由がわからないけど、このアプリを書いた前の人がそこにそれを入れて、それがどんな問題を起こしたことがないので、私は今のためにそこにそれを残しています。さらに、AppModelの代わりにUser to Modelを拡張しても、エラーは修正されません。
package models;
import javax.persistence.MappedSuperclass;
import io.ebean.Model;
@MappedSuperclass
public class AppModel extends Model
{}
また、ebeanサーバーの設定も試みました。 idジェネレータとパッケージの両方が空です。私はリストにモデルを追加しましたが、まだエラーが発生します。これは、ebeanが正しく構成されていないことを意味しますか?
package models;
...
public class MyServerConfigStartup implements ServerConfigStartup {
public void onStart(ServerConfig serverConfig) {
List<IdGenerator> gen = serverConfig.getIdGenerators();
System.out.println(gen); // []
List<String> pack1 = serverConfig.getPackages();
System.out.println(pack1); // []
ArrayList<String> packages = new ArrayList<String>();
packages.add("models.*");
serverConfig.setPackages(packages);
List<String> pack2 = serverConfig.getPackages();
System.out.println(pack2); // [models.*]
}
}
助けてください。ありがとうございました。