2017-11-20 9 views
0

現在、私のアプリケーションの再生を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.conf

ebean.default = ["models.*"]

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.2.0")

build.sbtで

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.*] 
    } 
} 

助けてください。ありがとうございました。

答えて

0

h2データベース内のid列には、auto_incrementが必要です。すべてのテーブルでALTER TABLE name ALTER COLUMN colName bigint not null auto_incrementを実行すると、この問題は解決されます。

関連する問題