休止状態の操作について質問があります: 更新。
ここに少しのコードがあります:
Campaign campaign = campaignDAO.get(id);
campaign.setStatus(true);
campaignDAO.update(campaign);
キャンペーン オブジェクトのすべてのデータがある場合、最初の選択 (campaignDAO.get(id)) を実行せずに更新を実行する方法はありますか?
ありがとう、
アレッシオ
休止状態の操作について質問があります: 更新。
ここに少しのコードがあります:
Campaign campaign = campaignDAO.get(id);
campaign.setStatus(true);
campaignDAO.update(campaign);
キャンペーン オブジェクトのすべてのデータがある場合、最初の選択 (campaignDAO.get(id)) を実行せずに更新を実行する方法はありますか?
ありがとう、
アレッシオ
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
。
session.load() を使用できます。データベースにはヒットしません。ここでは、その詳細とサンプル コードを確認できます。
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();
}
UpdateExtension.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の更新があります
command 0:UPDATE Customers SET Phone = @p0 WHERE CustomerID = @p1;@p0 = '2014/12/26 0:12:56' [タイプ: 文字列 (4000)], @p1 = 1 [タイプ: Int32 (0 )]
Phone 列のみを更新します。
イベントの Name プロパティを null にすることはできません。私たちはとてもうまく働くことができます。