我正在尝试使用带有ebeans的play 2.4来实现类似于计算机数据库示例的crud。一切都有效,除了更新。当我针对相同的MariaDB和较旧的ebeans(3.2.2)运行计算机数据库示例时,它确实更新得很好,因此似乎不是数据库的问题。虽然在使用ebeans时发现Maria JDBC驱动程序的错误,但我正在使用MySQL连接器。
此代码:
/**
* Handle the 'edit form' submission
*
* @param id Id of the user to edit
*/
public Result update(Long id) {
Form<User> userForm = form(User.class).bindFromRequest();
if(userForm.hasErrors()) {
return badRequest(editForm.render(id, userForm));
}
User userFromForm = userForm.get();
System.out.println(userForm.data());
userFromForm.update();
flash("success", "User " + userForm.get().alias + " has been updated");
return GO_HOME;
}
给出了这个错误: [OptimisticLockException:数据已更改。更新[0]行sql [更新用户设置别名=?,电子邮件=?,密码=?,活动=?,last_update =?,user_type_id =?其中id =?] bind [null]]
实体定义为
@Entity public class用户扩展Model {
private static final long serialVersionUID = 1L;
@Id
public Long id;
@Constraints.Required
public String alias;
@Constraints.Required
public String email;
@Constraints.Required
public String password;
@Constraints.Required
public char active;
@ManyToOne
public UserType userType;
@Version
@Column(columnDefinition = "timestamp default '2014-10-06 21:17:06'")
public Timestamp lastUpdate;
首先,版本没有按预期放在where子句中。此外,抛出乐观锁定错误。
我正在连接MySQL。所有其他操作,保存,删除等工作正常。 这又破了吗?
插件看起来像
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.4")
// Web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-web" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-webdriver" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-js-engine" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.6")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
// Play enhancer - this automatically generates getters/setters for public fields
// and rewrites accessors of these fields to use the getters/setters. Remove this
// plugin if you prefer not to have this feature, or disable on a per project
// basis using disablePlugins(PlayEnhancer) in your build.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using
// enablePlugins(SbtEbean). Note, uncommenting this line will automatically bring in
// Play enhancer, regardless of whether the line above is commented out or not.
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")
//Eclipse
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")
build.sbt是
name := """mecamu-play"""
version := "1.0-SNAPSHOT"
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, SbtWeb, PlayEnhancer)
scalaVersion := "2.11.6"
libraryDependencies ++= Seq(
javaJdbc,
cache,
javaWs
)
// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator
k in run := true
fork in run := true
任何帮助将不胜感激。我希望能够像以前一样使用ebean绑定表单更新。 非常感谢
答案 0 :(得分:2)
OptimisticLockException的含义是update语句更新了0行。这意味着where子句与现有行不匹配。这意味着你需要查看id和version列的特定绑定值:where id =?和版本=?
如果您已登录Ebean(请参阅http://ebean-orm.github.io/docs/setup/logging),则日志记录将包含绑定值。
一旦你知道更新的where子句中使用的绑定值,你需要确定它们为什么不正确(为什么它导致0行更新)...所以使用表单在bean上设置了什么值。
对我而言,这些是您需要遵循的步骤。
PS:仅仅因为您在Stackoverflow中记录问题并不意味着合适的人会查看您的问题。 Playframework和Ebean都有论坛,你可以寻求帮助。
答案 1 :(得分:0)
事实证明,这可能是ebeans 4.6.2的一个错误 https://github.com/playframework/play-ebean/issues/44 我将看看我是否可以使用更高版本的问题,如4.7.2或更高版本。由于Play现在正在使用ebeans的插件模型,我不太清楚如何控制哪个版本被拉入。我对scala / sbt相当新。 4.6.2的这个错误解释了为什么早期版本似乎更新。
答案 2 :(得分:0)
尝试查看您的文件1.sql并检查列是否存在或尝试查询describe your_table
,如果它不存在则尝试删除表并重新导入相同的表脚本SQL