我在DB中有一个列,默认值为sysdate.我正在寻找一种方法来插入默认值,而我没有给应用程序端的相应属性提供任何内容.顺便说一句,我正在使用基于注释的配置.
有什么建议?
我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用@Prepersist,并@PreUpdate在POJO照顾LastModified使用Hibernate与会话实现JPA的领域(INSERT和UPDATE).
原因?:这个更改是必需的,因为需要使用liquibase 1.9.5并且我知道(因为我之前已经面对过)liquibase将时间戳转换为使用默认current_timestamp的日期时间,这对于mysql数据库来说太糟糕了.
所以我需要一种方法来在代码中而不是在数据库中设置这个集合所以我可以安全地将时间戳字段更改为datetime.then liquibase很高兴,我很高兴.
现在似乎那些解释器没有被执行,很少有搜索我发现它适合使用entityManager.目前是不可能的.所以我想知道是否有一个简单的方法解决我的问题,这意味着有@Prepersist或@PreUpdate或甚至其他解决方法来设置lastModified仍然使用会话的字段
我正在使用Hibernate为一个小项目实现createDate和lastUpdate时间戳.我使用一个EmptyInterceptor并根据我在这里找到的建议解决方案重载提供的方法.解决方案除了一个小细节外,工作正常.我想添加一个列,指示对象是否已经更新.我知道我可以通过简单比较两个创建和更新的时间戳是否存在差异来实现这一点,但我需要让此字段指示存在更新.
我使用onSave方法,在存储新对象时调用该方法将wasUpdated值设置为'N',表示没有更新.在onFlushDirty()方法中,我将此值设置为"Y".
我想说当我创建并持久保存新的Object时,createDate和lastUpdate字段具有相同的Date,但wasUpdated字段设置为'N',因为没有更新.我只在我的代码中使用session.save(),没有session.update(),也没有session.saveOrUpdate().Hibernate的日志表明实际上有一个Update,它将wasUpdated值设置为'Y'.
什么可以作为此更新的来源?它在哪里被触发?
我在hibernate.cfg.xml中禁用了自动提交.
<property name="hibernate.connection.autocommit">false</property>
Run Code Online (Sandbox Code Playgroud)
这是我创建对象的方式:
ExampleObject ex = new ExampleObject();
ex.setValue("TestStringValue");
this.session = HibernateUtil.getSessionFactory().openSession();
this.session.beginTransaction();
this.session.save(ex);
this.session.getTransaction().commit();
this.session.close();
Run Code Online (Sandbox Code Playgroud)
@Override
public boolean onSave(Object entity, Serializable id, Object[] state,
String[] propertyNames, Type[] types) {
if (entity instanceof TimeStamped) {
Date insertDate = new Date();
int indexOfCreateDateColumn = ArrayUtils.indexOf(propertyNames, "createdDate");
int indexOfUpdatedDateColumn = ArrayUtils.indexOf(propertyNames, "lastUpdatedDate");
int indexOfWasUpdated = ArrayUtils.indexOf(propertyNames, "wasUpdated");
state[indexOfCreateDateColumn] =insertDate;
state[indexOfUpdatedDateColumn] =insertDate;
state[indexOfWasUpdated] ='N';
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法是设置lastUpdatedDate并将wasUpdated字段设置为'Y'.
@Override …Run Code Online (Sandbox Code Playgroud) 我们正在开发您的沼泽标准Java应用程序,我们正在创建的许多记录(MySQL中的Hibernate实体)已经"创建"和"修改"了它们的时间戳.
现在,我和其中一个开发人员不同意 - 我相信这两个字段都应该有一个MySQL默认值为CURRENT_TIMESTAMP,然后修改后的应用程序可以更改.他希望两者都由应用程序管理.
两种决定都有令人信服的理由吗?我不明白为什么你要为代码添加更多显式步骤,除非由于某种原因你担心你的服务器(db,application)有不一致的时间戳.
我在表上有一个TIMESTAMP列,在最初插入记录时设置为null.我想将值更新为当前时间.我生成的实体有一个set字段的set方法:
setCloseDate(Timestamp closeDate)
Run Code Online (Sandbox Code Playgroud)
但是我不想从java代码生成/指定时间戳.有没有办法在持久化实体时注释属性以指示在数据库级别使用当前时间?
如果没有,那么执行这样的更新会有什么好的策略?
在我想要运行的查询的下面是这样的:
update CASE_FILE set CLOSE_DATE=CURRENT_TIMESTAMP where ID=1
Run Code Online (Sandbox Code Playgroud)
我刚刚开始使用JPA ......所以可能会遗漏一些相当明显的东西.谢谢!
当我创建一个新的操作银行时,我需要自动将当前日期添加到我的数据库中。我正在使用休眠。谢谢
import java.io.Serializable;
import java.sql.Date;
import javax.persistence.*;
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
@Entity
public class OperationBank implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String wordring;
private Double amount;
@Generated(GenerationTime.ALWAYS)
@Temporal(javax.persistence.TemporalType.DATE)
private Date dateoperation = new java.sql.Date(new java.util.Date().getTime());
@OneToOne
private Account account;
Run Code Online (Sandbox Code Playgroud)