4

我有一个关于休眠操作的问题:更新。

这里有一点代码:

Campaign campaign = campaignDAO.get(id);
campaign.setStatus(true);
campaignDAO.update(campaign);

如果我只有活动对象的所有数据,有没有办法在不执行第一次选择 (campaignDAO.get(id)) 的情况下执行更新?

谢谢,

阿莱西奥

4

3 回答 3

5

HQL 肯定会帮助你。

为了保持关注点的分离,你可以在你的 DAO 对象中添加一个更专业的方法:

public void updateStatusForId(long id, boolean status){
//provided you obtain a reference to your session object
session.createQuery("UPDATE Campaign SET status = " + status + " WHERE id = :id").setParameter("id", id).executeUpdate();
//flush your session
}

然后您可以简单地从您的业务方法中调用此方法。show_sql您可以通过将hibernate 属性设置为 来检查应用程序日志中生成的 SQL 语句true

于 2013-11-06T10:22:33.103 回答
1

您可以使用 session.load()。它不会命中数据库。在这里您可以找到它的详细信息和示例代码。

于 2013-11-06T10:23:17.457 回答
-1

我写了一个扩展来解决Nhibernate中的这个问题

如何使用!
首先你需要启用dynamic-update="true"

        using (ISession session = sessionFactory.OpenSession())
        {
            Customer c1 = new Customer();
            c1.CustomerID = c.CustomerID;
            session.Mark(c1);
           // c1.Name = DateTime.Now.ToString();
            c1.Phone = DateTime.Now.ToString();
            //需要开启动态更新
            session.UpdateDirty(c1);
            session.Flush();
        }

更新扩展.cs

    public static class UpdateExtension
{
    static readonly Object NOTNULL = new Object();

    public static void UpdateDirty<TEntity>(this ISession session, TEntity entity)
    {
        SessionImpl implementor = session as SessionImpl;
        EntityEntry entry = implementor.PersistenceContext.GetEntry(entity);

        if (entry == null)
        {
            throw new InvalidOperationException("找不到对应的实例,请先使用Mask方法标记");
        }

        IEntityPersister persister = entry.Persister;

        // 如果某列不可以为空,新的Entity里也不想更新他。
        // 那么LoadState 里的值应该和Entity 中的值相同

        Object[] CurrentState = entry.Persister.GetPropertyValues(entity, EntityMode.Poco);
        Object[] LoadedState = entry.LoadedState;

        int[] dirtys = persister.FindDirty(CurrentState
            , LoadedState
            , entity
            , (SessionImpl)session);

        if (dirtys == null || dirtys.Length == 0)
        {
            return;
        }

        persister.Update(entry.Id
            , CurrentState
            , dirtys
            , true
            , LoadedState
            , entry.Version
            , entity
            , entry.RowId
            , (SessionImpl)session);

        implementor.PersistenceContext.RemoveEntry(entity);
        implementor.PersistenceContext.RemoveEntity(entry.EntityKey);


        session.Lock(entity, LockMode.None);
         // 防止(implementor.PersistenceContext.EntityEntries.Count == 0)


    }


    public static void Mark<TEntity>(this ISession session, TEntity entity)
    {

        session.Lock(entity, LockMode.None);

    }
}

这是更新sql

命令 0:更新客户 SET 电话 = @p0 WHERE CustomerID = @p1;@p0 = '2014/12/26 0:12:56' [类型:字符串 (4000)],@p1 = 1 [类型:Int32 (0 )]

只更新电话栏。

事件名称属性不能为空。我们可以很好地工作。

于 2014-12-25T16:14:27.037 回答