将@PrePersist 和@PreUpdate 与Ebean 和Play 2 一起使用。5.x 不起作用?
Using @PrePersist and @PreUpdate with Ebean and Play 2.5.x not working?
我有一个奇怪的问题,当我按照简单的记录方式进行操作时,我无法理解为什么它会起作用,我有以下实体:
@Entity
@Table(name = "users")
public class User extends Model {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
@CreatedTimestamp
private DateTime createdDate;
@Column
@UpdatedTimestamp
private DateTime updatedDate;
@Column
@Version
private long version = 0;
@Column(length = 35, nullable = false)
@Constraints.Required
@Constraints.MinLength(2)
@Constraints.MaxLength(50)
private String firstName;
@Column(length = 35, nullable = false)
@Constraints.Required
@Constraints.MinLength(2)
@Constraints.MaxLength(50)
private String lastName;
@Column(length = 256)
@Constraints.MaxLength(256)
private String jobTitle;
@Column(length = 1000)
@JsonIgnore
private String options;
@Transient
private Map<String, Object> properties = new HashMap<>();
@PrePersist
protected void prePersist() throws IOException {
Logger.warn("PrePersist called");
}
@PreUpdate
protected void preUpdate() throws IOException {
Logger.warn("PreUpdate called");
}
@PostLoad
private void postLoad() throws IOException {
Logger.warn("PostLoad called");
}
// settlers and getters here
}
然后对于新用户,我调用控制器或服务:
User user = new User();
user.setFirstName("Someone").setLastName("Last Name"); // etc
//then
user.insert();
// or you can even try
// user.save();
我正在尝试保存新用户和更新用户,在调试时让用户断点不调用具有 @PrePersist
、@PreUpdate
和 @PostLoad
的方法,但它们是根本没有调用,在实际应用中,我做了一些从 JSON 字符串到 Map options
到 properties
的转换,反之亦然。
应该支持:http://ebean-orm.github.io/docs/features/eventlistening
我正在使用 play 2.5.6 和 sbt-play-ebean 3.0.2 .
好吧,我不确定这是一个愚蠢的错误还是被误解了,但问题是这些方法有错误的访问修饰符。
它们必须是 public
,而不是 protected
或 private
:
@PrePersist
public void prePersist() throws IOException {
Logger.warn("PrePersist called");
}
@PreUpdate
public void preUpdate() throws IOException {
Logger.warn("PreUpdate called");
}
@PostLoad
public void postLoad() throws IOException {
Logger.warn("PostLoad called");
}
编辑:以防万一,如果 @Transient
列被修改,@PreUpdate
和 PrePersist
将不起作用。
我有一个奇怪的问题,当我按照简单的记录方式进行操作时,我无法理解为什么它会起作用,我有以下实体:
@Entity
@Table(name = "users")
public class User extends Model {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
@CreatedTimestamp
private DateTime createdDate;
@Column
@UpdatedTimestamp
private DateTime updatedDate;
@Column
@Version
private long version = 0;
@Column(length = 35, nullable = false)
@Constraints.Required
@Constraints.MinLength(2)
@Constraints.MaxLength(50)
private String firstName;
@Column(length = 35, nullable = false)
@Constraints.Required
@Constraints.MinLength(2)
@Constraints.MaxLength(50)
private String lastName;
@Column(length = 256)
@Constraints.MaxLength(256)
private String jobTitle;
@Column(length = 1000)
@JsonIgnore
private String options;
@Transient
private Map<String, Object> properties = new HashMap<>();
@PrePersist
protected void prePersist() throws IOException {
Logger.warn("PrePersist called");
}
@PreUpdate
protected void preUpdate() throws IOException {
Logger.warn("PreUpdate called");
}
@PostLoad
private void postLoad() throws IOException {
Logger.warn("PostLoad called");
}
// settlers and getters here
}
然后对于新用户,我调用控制器或服务:
User user = new User();
user.setFirstName("Someone").setLastName("Last Name"); // etc
//then
user.insert();
// or you can even try
// user.save();
我正在尝试保存新用户和更新用户,在调试时让用户断点不调用具有 @PrePersist
、@PreUpdate
和 @PostLoad
的方法,但它们是根本没有调用,在实际应用中,我做了一些从 JSON 字符串到 Map options
到 properties
的转换,反之亦然。
应该支持:http://ebean-orm.github.io/docs/features/eventlistening
我正在使用 play 2.5.6 和 sbt-play-ebean 3.0.2 .
好吧,我不确定这是一个愚蠢的错误还是被误解了,但问题是这些方法有错误的访问修饰符。
它们必须是 public
,而不是 protected
或 private
:
@PrePersist
public void prePersist() throws IOException {
Logger.warn("PrePersist called");
}
@PreUpdate
public void preUpdate() throws IOException {
Logger.warn("PreUpdate called");
}
@PostLoad
public void postLoad() throws IOException {
Logger.warn("PostLoad called");
}
编辑:以防万一,如果 @Transient
列被修改,@PreUpdate
和 PrePersist
将不起作用。