カスタムデータベース同期


機能として、Web側のデータベースで現在のユーザーに関連するデータをモバイルデバイス側に同期する必要があります.モバイルデバイス側は、ネットワークに接続されている場合にデータをタイミングよく同期し、ネットワークに接続されていない場合に古いデータを照会することができます.
解決策は次のとおりです.
1.初期状態のWeb側データベースが空であると仮定します.ユーザーは、データの記録中にアクションをログ・テーブルに記録します.
2.モバイルデバイス側でスレッドを起動し、ログ・テーブルに定期的にアクセスします.自分に関する最新の変更記録を取得します.
3.これらの変更をローカルSQLiteに更新する
技術への使用:
1.ユーザのすべての操作をHibernate Listenerで記録する.関心テーブルの操作をログテーブルに記入します.ログ・テーブルには、アクション・タイプ(insert update delete)、アクション・テーブル名、レコードID、およびオペレータが含まれます.
2.Hibernate Listenerにサーブレットがなく、現在のオペレータの情報を取得できません.だからThreadLocalを使う
いくつかの疑問:
1.aspectJでSessionクラスを切り取り、データベース操作ログを記録するつもりだった.aspectJがSessionで接面するコードが実行されないことが分かった.原因は不明ですが、hibernate動的生成コードと関係がある可能性があります.



public class HibernateHistoryListener implements PostInsertEventListener,
		PostUpdateEventListener, PostDeleteEventListener {

	static final Class accessClass[] = { DmMenu.class, DmRMenuDish.class,
			DmCategory.class, DmDish.class, DmDishImage.class, DmEvaluate.class };
	public final static ThreadLocal userLocal = new ThreadLocal();

	public void onPostInsert(PostInsertEvent arg) {
		log("insert", arg.getEntity(), arg.getId().toString(), arg.getSession());

	}

	public void onPostUpdate(PostUpdateEvent arg) {
		log("update", arg.getEntity(), arg.getId().toString(), arg.getSession());
	}

	public void onPostDelete(PostDeleteEvent arg) {
		log("delete", arg.getEntity(), arg.getId().toString(), arg.getSession());

	}

	private void log(String method, Object obj, String id, Session session) {

		boolean access = false;
		for (int i = 0; i < accessClass.length; i++) {
			Class array_element = accessClass[i];
			if (obj.getClass().equals(array_element)) {
				access = true;
				break;
			}

		}
		if (!access) {
			return;
		}
		DmOperationLog log = new DmOperationLog();
		log.setOperationName(method);
		log.setOperationTime(new Date());
		log.setRecordId(id);
		log.setTargetName(obj.getClass().toString());
		log.setDmUser((DmUser) userLocal.get());

		Session temp = session.getSessionFactory().openSession();
		Transaction tx = null;
		try {
			tx = temp.beginTransaction();
			temp.save(log);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
		} finally {
			temp.close();
		}
	}

}