2017-11-20 19 views
0

현재 응용 프로그램의 재생을 2.4.x에서 2.5.18로 업그레이드하는 중입니다. play의 문서로, 나는 또한 play-ebean을 1.0.0에서 3.2.0으로 업그레이드했으며, ebean 10.4.x를 사용합니다.재생 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가 새로 삽입 된 콩에 대한 ID를 생성하지 않는 것 같다 내가 H2 데이터베이스에 빈을 삽입 할 때마다 업그레이드 한 후에는이 오류를 제공합니다. 저장하기 전에 ID를 수동으로 설정할 때 오류가 발생하지 않습니다 (user.id = 123). 그러나, 나는 정말로 id 생성이 다시 작동하기를 원한다.

버전 :

  • 플레이 2.5.18
  • 플레이 ebean 3.2.0
  • H2 데이터베이스 1.4.185
  • 데드 2.5.6
  • 자바 1.8.0 업데이 트 (151)

In plugins.sbt

application.conf

ebean.default = ["models.*"]

이에서 build.sbt

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean).settings(libraryDependencies ++= appDependencies) 

libraryDependencies ++= Seq(
    javaCore, 
    javaJdbc, 
    cache, 
    evolutions, 
    javaWs 
) 

에서 6,

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

는 사용자의 정보를 저장하는 모델이다. 또한 deadbolt의 Subject를 구현합니다. 나는 모델에서 save를 오버라이드하지 않을 것이라고 4 배 검사했다.

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 대신 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을 실행하면이 문제가 해결됩니다.