我正在使用Spring 3.1.0.RELEASE,JSF 2.x,JPA 2和Hibernate Provider,MySql 5.1.x进行Web应用程序.该应用程序在Tomcat 7.X上运行.
在我的实体中,我有一些日期,如上次更新日期:
@Column(name = "last_update_date", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdateDate;
Run Code Online (Sandbox Code Playgroud)
目前我有一个更新的触发器:
CREATE TRIGGER upd_site BEFORE UPDATE ON site
FOR EACH ROW SET NEW.last_update_date = CURRENT_TIMESTAMP();
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我只是注意到JPA中有一些回调方法http://www.objectdb.com/java/jpa/persistence/event
JPA Events和MySql的触发器之间最好的是什么?
谢谢.
JB *_*zet 29
没有最好的事情.无论以何种方式更新行(Hibernate,JDBC查询或数据库管理工具的更新),数据库触发器都会在每次更新行时更新上次更新日期.只有在使用JPA更新行时才会调用JPA回调.你可能想要一个或另一个.
另一个区别是JPA不知道数据库执行的触发器.因此,如果更新实体中的某个字段,并且JPA刷新了更改,则触发器将修改更新日期,但JPA实体将在内存中保留更新日期的旧值.因此,如果在更新后GUI中显示此更新日期,则更新日期将不正确.您必须刷新实体才能获得最新的更新日期.
ams*_*ams 20
我已经在数据库和JPA监听器中使用了触发器的两种方式,我已经确定了JPA监听器,因为:
唯一的代码在JPA代码中与数据库通信,所以我不必担心时间戳字段过时.(如果将来发生这种变化,我可以添加触发器并更改我映射的超级calss)
从某种意义上说,JPA监听器不那么复杂,我不需要在我的数据库中创建大量的触发器,因此我需要维护的东西较少.因为我正在积极开发和更改数据库结构,因为我很快就不必去更新触发器,因为我会快速迭代开发.
我完全控制了数据库并为数据库制定了一个规则,即每个表都有一个整数pkey和一个整数版本,并且带有时间戳的表格insert_ts和update_ts列这些是我的数据库设计中的通用规则所以生命很容易我有这两个映射的超级语句,使我的所有enitites都很容易编码,因为我从它们延伸.
@MappedSuperclass
public abstract class PersistableObject {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="pkey")
private Integer pkey;
@Version
@Column(name="version")
private Integer version;
public Integer getPkey() {
return this.pkey;
}
public Integer getVersion() {
return this.version;
}
@Override
public String toString() {
return "Presistable Object: pkey=" + this.pkey + " Object: " + this.getClass().getName();
}
}
Run Code Online (Sandbox Code Playgroud)
和
@MappedSuperclass
public class TimeStampedPersistableObject extends PersistableObject {
@Column(name = "insert_ts")
@Temporal(TemporalType.TIMESTAMP)
private Date insertTimestamp;
@Column(name = "update_ts")
@Temporal(TemporalType.TIMESTAMP)
private Date updateTimestamp;
@SuppressWarnings("unused")
@PrePersist
private void onInsert() {
this.insertTimestamp = new Date();
this.updateTimestamp = this.insertTimestamp;
}
@SuppressWarnings("unused")
@PreUpdate
private void onUpdate() {
this.updateTimestamp = new Date();
}
public Date getInsertTimestamp() {
return this.insertTimestamp;
}
public Date getUpdateTimestamp() {
return this.updateTimestamp;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15726 次 |
| 最近记录: |