Nhibernate 在hibernate中,如何始终使用db server';时间戳?

Nhibernate 在hibernate中,如何始终使用db server';时间戳?,nhibernate,hibernate,Nhibernate,Hibernate,我想在我的表的last\u update列中添加db服务器的时间戳。如何在hibernate中实现这一点 谢谢这不是一个很好的解决方案,但很有效。使用公式属性 <property name='ServerDate' formula='getdate()'/> 将该字段放在某种虚拟实体中,您将能够从SQL数据库中提取日期,并从那里将其分配给您的last\u update列 我已经做了相当多的搜索,但还没有找到一个更简单的方法来实现这一点。这不是一个很好的解决方案,但它很有效。使用

我想在我的表的last\u update列中添加db服务器的时间戳。如何在hibernate中实现这一点


谢谢

这不是一个很好的解决方案,但很有效。使用公式属性

<property name='ServerDate' formula='getdate()'/>

将该字段放在某种虚拟实体中,您将能够从SQL数据库中提取日期,并从那里将其分配给您的
last\u update


我已经做了相当多的搜索,但还没有找到一个更简单的方法来实现这一点。

这不是一个很好的解决方案,但它很有效。使用公式属性

<property name='ServerDate' formula='getdate()'/>

将该字段放在某种虚拟实体中,您将能够从SQL数据库中提取日期,并从那里将其分配给您的
last\u update


我已经做了很多搜索,但还没有找到更简单的方法。

您可以创建一个新的SaveOrUpdateEventListener:

public class DateTimeSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener
{
    protected override object EntityIsPersistent(SaveOrUpdateEvent @event)
    {
        MyEntity ent = @event.Entity as MyEntity;
        if(ent != null)
            ent.LastUpdate = DateTime.Now;
        return base.EntityIsPersistent(@event);
    }

    protected override object EntityIsTransient(SaveOrUpdateEvent @event)
    {
        MyEntity ent = @event.Entity as MyEntity;
        if(ent != null)
            ent.LastUpdate = DateTime.Now;
        return base.EntityIsTransient(@event);
    }
}
并将其注册到您的配置中,如下所示:

var listener = new DateTimeSaveOrUpdateEventListener();
config.SetListener(NHibernate.Event.ListenerType.SaveUpdate, listener);
config.SetListener(NHibernate.Event.ListenerType.Save, listener);

您可以创建新的SaveOrUpdateEventListener:

public class DateTimeSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener
{
    protected override object EntityIsPersistent(SaveOrUpdateEvent @event)
    {
        MyEntity ent = @event.Entity as MyEntity;
        if(ent != null)
            ent.LastUpdate = DateTime.Now;
        return base.EntityIsPersistent(@event);
    }

    protected override object EntityIsTransient(SaveOrUpdateEvent @event)
    {
        MyEntity ent = @event.Entity as MyEntity;
        if(ent != null)
            ent.LastUpdate = DateTime.Now;
        return base.EntityIsTransient(@event);
    }
}
并将其注册到您的配置中,如下所示:

var listener = new DateTimeSaveOrUpdateEventListener();
config.SetListener(NHibernate.Event.ListenerType.SaveUpdate, listener);
config.SetListener(NHibernate.Event.ListenerType.Save, listener);

我使用了HQL,它很有效

entity.setLastUpdate((Date) session.createSQLQuery(
        "select getdate()").list().get(0))

我使用了HQL,它很有效

entity.setLastUpdate((Date) session.createSQLQuery(
        "select getdate()").list().get(0))

感谢您的回答,这是否意味着我不能将ServerDate作为要保存的对象的属性之一,并且我必须使用虚拟实体?您可以,但您仍然必须分配它。我只推荐虚拟实体,因为将该字段作为真实实体的属性可能会产生误导。好的,我是hibernate新手,是否必须为该虚拟实体创建配置文件?如何获取ServerDate并稍后将其分配回last_update字段?是的,像通常一样创建配置文件。将它指向某个任意表,并执行检索实例所需的所有正常工作。拥有对象后,此属性将填充SQL server的日期,您可以将其分配给正在使用的实体的上次更新属性。我们不能从hibernate SQL获取数据库日期并使用它吗?谢谢您的回答,这是否意味着我不能将ServerDate作为要保存的对象的属性之一,我必须使用虚拟实体?可以,但仍然必须分配它。我只推荐虚拟实体,因为将该字段作为真实实体的属性可能会产生误导。好的,我是hibernate新手,是否必须为该虚拟实体创建配置文件?如何获取ServerDate并稍后将其分配回last_update字段?是的,像通常一样创建配置文件。将它指向某个任意表,并执行检索实例所需的所有正常工作。拥有对象后,此属性将填充SQL server的日期,您可以将其分配给正在使用的实体的上次更新属性。我们不能从hibernate SQL获取数据库日期并使用它吗?