/** 현재 시작된 {@link IUnitOfWork}의 인스턴스 ({@link UnitOfWorkAdapter}를 반환합니다. */ public static synchronized IUnitOfWork getCurrent() { if (!isStarted()) throw new HibernateException(UNIT_OF_WORK_NOT_STARTED); if (globalNonThreadSafeUnitOfWork != null) return globalNonThreadSafeUnitOfWork; return Local.get(IUnitOfWork.CURRENT_UNIT_OF_WORK_KEY, IUnitOfWork.class); }
/** 현재 Thread Context하에서 사용할 TimeCalendar입니다. */ public static ITimeCalendar getTimeCalendar() { ITimeCalendar calendar = Local.get(TIME_CALENDAR_KEY, ITimeCalendar.class); if (calendar == null) { calendar = TimeCalendar.getDefault(); Local.put(TIME_CALENDAR_KEY, calendar); } return calendar; }
/** * Start new unit of work. * * @param sessionFactory {@link SessionFactory} instance. * @param nestingOptions 생성 옵션 {@link UnitOfWorkNestingOptions} * @return {@link IUnitOfWork} instance. */ public static synchronized IUnitOfWork start( SessionFactory sessionFactory, UnitOfWorkNestingOptions nestingOptions) { if (log.isDebugEnabled()) log.debug( "새로운 UnitOfWork를 시작합니다... sessionFactory=[{}], nestingOptions=[{}]", sessionFactory, nestingOptions); if (globalNonThreadSafeUnitOfWork != null) return globalNonThreadSafeUnitOfWork; IUnitOfWorkImplementor existing = Local.get(IUnitOfWork.CURRENT_UNIT_OF_WORK_KEY, IUnitOfWorkImplementor.class); boolean useExisting = existing != null && nestingOptions == UnitOfWorkNestingOptions.ReturnExistingOrCreateUnitOfWork; if (useExisting) { if (log.isTraceEnabled()) log.trace( "기존 IUnitOfWork 가 존재하므로, 사용횟수만 증가시키고, 기존 IUnitOfWork 인스턴스를 반환합니다. 사용횟수=[{}]", existing.getUsage()); existing.increseUsage(); return existing; } if (log.isTraceEnabled()) log.trace("새로운 IUnitOfWorkFactory 와 IUnitOfWork 를 생성합니다..."); if (existing != null && sessionFactory == null) { sessionFactory = existing.getSession().getSessionFactory(); } else if (existing == null) { sessionFactory = getCurrentSessionFactory(); } setCurrent(getUnitOfWorkFactory().create(sessionFactory, existing)); if (log.isDebugEnabled()) log.debug("새로운 IUnitOfWork를 시작했습니다. sessionFactory=[{}]", sessionFactory); return getCurrent(); }
/** UnitOfWork 가 이미 시작되었는지 확인한다. */ public static synchronized boolean isStarted() { return globalNonThreadSafeUnitOfWork != null || Local.get(IUnitOfWork.CURRENT_UNIT_OF_WORK_KEY) != null; }