현재 응용 프로그램의 재생을 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.confebean.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.*]
}
}
도움을 주시면 감사하겠습니다. 고맙습니다.