|
֪ʹ TopLink Ĵ붼Ҫ TopLink Sessionر oracle.toplink.sessions.Session IoC УԴ TopLink SessionԽˣSpring TopLink ṩ Spring ܵһչչʹûܹ Spring ApplicationContext߽ TopLink Session ע뵽 DataAccess С
ͼУΨһʵʹ TopLink DataAccess BeanȻص TopLink Session ijʼΪƵأDataAccessBean Χͨ TopLink ض PlatformTransactionManager JtaTransactionManager
е Session Management ö㣨ݷʲ㣩ִС
ּɲı TopLink Session ĻʹģʽȻϣû TopLink Session api гֵ˽⡣ּɽȷ TopLink Session лԶ Spring
TopLink ûҪҪĽӿڡoracle.toplink.sessions.Session ӿݷʵʼ㣬oracle.toplink.sessions.UnitOfWork ӿݷʲԵײģͽиġԴлԣ磺
- ݷʴڵ̻߳Ƕ̻߳У
- ṩЩݿԴ
- ûỰĻǷطеĻỰ
- ιģ
- Ӧóбع
- ʹⲿ
- J2EE ʹ JTA TransactionManager
һԣݷʴ뱾Ĵ𰸡Ҫһ TopLink Session ʶ TopLink UnitOfWorkԹԶĸġһЩⲿע롣 Spring УӦó BeanFactory ApplicationContext вңԻȡݷʲķȨʹ Spring ִܹע룬ȷݷʴʼһȷõ TopLink SessionȷС
ΪʵЩҪѶ TopLink Session ķģ廯ʽģ Spring AOPģִҪĹܣ
- ȷ Session ȷãʹȷ
- е쳣е쳣תΪ Spring DataAccessException νṹ
- һݲɣȷͷеԴҪĻ
ƵأеҲ Spring ע롣磬ڲ֧ JTA Ļн˲ԣСϣ벿 JTA ĻУôֻͨ Spring BeanFactory ͿʵִĿġݷʲʵʩκθġ
ԣЩĿǰij̶ֳϣѾڵģʽTopLink Ѿʹ ExternalTransactionController JTA ͬˡTopLink ѾԴһ SessionManager ӿڡĿĿǣܹ Spring ܷʹõķʽЩһ
TopLink Session ģ廯
Ϊʹܹʹ TopLink Session TopLink SessionFactory ԡͨ Spring beans.xml ļдʵĿʵֵġʾУһΪ myDAOImpl ݷͨ toplinkSessionFactory ö TopLink Session ķʡtoplinkSessionFactory ʹ TopLink sessions.xml ļá
<beans> <bean id="toplinkSessionFactory" class="org.springframework.orm.toplink.SessionFactoryBean"> <property name="sessionsConfig"> <value>sessions.xml</value> </property> <property name="sessionName"> <value>mySession"</value> </property> </bean>
<bean id="myDAOImpl" class="domain.model.MyDAOImpl"> <property name="sessionFactory"> <ref bean="toplinkSessionFactory"> </property> </bean> </beans>
DAO ʵʩԷ TopLink Session ķʽе TopLink 붼Է TopLinkCallback УԱʽؽ TopLink ķģ廯ģʽһʾʾ£
public class MyDAOImpl extends TopLinkDaoSupport implements DAOInterface { public Object doTopLinkOperation() { return getTopLinkTemplate().execute(
new TopLinkCallback() { public Object doInTopLink(Session session) throws TopLinkException { // this Session is managed externally. // It is "injected" by the currently referenced SessionFactory } }); } }
Ȼʾʹһڲ࣬ЩصҲԵ⣬ TopLink TopLinkTemplate ϹԱʾķʽд룺
public class MyDAOImpl extends TopLinkDaoSupport implements DAOInterface { public Object doTopLinkOperation() { return getTopLinkTemplate().findByNamedQuery ("findMyself",Person.class,args); } }
κ£DAO TopLink SessionҪ UnitOfWork ô֤κεǰͣһ JTA ͬ
ֻģĻƵһʽʹ Spring AOPַʽУһȡ TopLinkTemplate Ĺûͨ Spring ProxyFactoryBean ȷȡǵݷʴ롣 Spring еһУ (Proxy) ͽȡ (Interceptor) ԱʽעԵʾУע TopLinkInterceptor жӦ TopLinkSessionFactory ãʹ ProxyFactoryBean ProxyFactoryBeans ϸϢй Spring AOP ĵ
<bean id="myTopLinkInterceptor" class="org.springframework.orm.toplink.TopLinkInterceptor" > <property name="sessionFactory"> <ref bean="toplinkSessionFactory"> </property> </bean>
<bean id="myDao" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>domain.model.DAOInterface</value> </property> <property name="interceptorNames"> <list> <value>myTopLinkInterceptor</value> <value>myDaoImpl</value> </list> </property> </bean>
TopLink ĴʹûصͿʵһĿġһЩûܷģʽֱۡȻһֺ۵κ£MyDAOImpl еĴ붼Ҫģ壺
public class MyDaoImpl extends TopLinkDaoSupport implements DAOInterface { public Object doTopLinkOperation() throws MyException { Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); try { // Session is ready to use in this code block } catch (TopLinkException ex) { throw TopLinkSessionFactoryUtils.convertTopLinkAccessException(ex); } } }
ûԸ⽫ MyDAOImpl ΪԭͶǵֵ (singleton)ôҲɾʹõ SessionFactoryUtilsȻڴݷ״̬ģӦΪֵ
Ϊѣע˽ӿ DAOInterface ĴԡSpring ProxyFactoryBean ڸýӿڵĴԡָ˽ӿڣô Spring ܹʹһ̬ (Dynamic Proxy) ʵʩΪȻûָӿڣô ProxyFactoryBean ʹ CGLib ʵĴͬⲻ TopLink еΪ Spring AOP һġ
ģ巽 ProxyFactoryBean ֮ҪIJǣ߿δ쳣ģķδ쳣 TopLink ⲻǸ⣩
ǻû۵һϸ߽ĸȡģ嶼ûڿʼύаκνɫDAO ı߽һȵı߽СȻDZȷݷʲʹõκ UnitOfWork 뵱ǰκȷͬǽԺֶԴ˽ϸۡ
TopLink Session ʹ
ǰ TopLink Spring ֮ļɲӰ TopLink Session ʹá֮ϣû Session UnitOfWork api ȫ˽⡣ȻδĹУϣͬ͵ TopLink Sessions ע뵽ݷʲС磬Sessionѯؿ༭עᵽ UnitOfWork еĶǰĿܷdzʺµ Session ԣΪעǿ TopLink Session 漰 SessionFactory ļ顣
ȻڵǰļɶԣûӦʹѼ¼ʵ磺
- ʹѯ
- Session ѯصжϸֻģܱ༭ġ
- ڸ֮ǰڻ UnitOfWork עᡣ
ǰɵҪǣ Spring Session ѱдȷ¶һĵöӦڵǰʹõ UnitOfWork
getActiveUnitOfWork()
acquireUnitOfWork()
ݷʴһ㲻漰ݷԲɷָķʽ Spring “ע”һʹá⣬getActiveUnitOfWork acquireUnitOfWork ֮IJζҪ˽һЩǰ Session ÷ʽΥ“ע”뷨ˣ Spring ע SessionΪͬġ
һݷʲڵǰ UnitOfWork ϵκ commit() Ƿ塣һпUnitOfWork һ֮һ
- J2EE е
TopLinkTransactionManager
- J2EE е
JTATransactionManager
- ʹ Spring
PlatformTransactionManager J2EE е UserTransaction TopLink ExternalTransactionController
ݷʲеû뽫ݷʲı߽ڲύģô⽫ܿƻеκһTopLink ExternalTransactionController ӿͨ UnitOfWork ⲿͬʱֹϽύڵǰļУDzһƵķʽ UnitOfWork ijЩ Spring PlatformTransactionManager ʵʩʱִֹ“ύ”
Spring Ựƣⲿ TransactionManager Spring ע뵽ϵͳСʵϣSpring TransactionManagement Ĵϸȫ TopLink ءͬ Spring ĵһֺܺõضԸ˵
һԣԼַʽ֮һʹԴķʽͬ
TopLink IJ
TopLinkTransactionManager (org.springframework.orm.toplink)
- Ӧ漰һ TopLink Session ĸʱdz
- TopLink ݿύ JTA Ĵԡ
- TopLink
- TopLink ʹ
ExternalTransactionController
- ʹԴ TopLink
ӳ
JtaTransactionManager (org.springframework.transaction)
- Ӧ漰Լ TopLink Session ʱdz
- Ҫ JTA
- TopLink
- TopLink Session ʹ
ExternalTransactionControllerƺе˳Ծ
- TopLink ¼ʹԴ
-
useExternalTransactionController TopLink ¼
Ӧó JTA (UserTransaction)
- Ӧ
JtaTransactionManager ƣûʹ Spring ñ߽
- Ҫ JTA
- TopLink
- TopLink Session ʹ
ExternalTransactionController
- TopLink ¼ʹⲿԴ
-
useExternalTransactionController TopLink ¼
ڵһУ漰Խɵ TopLink ĶĸġãΪڶ JTA ԣԿ J2EE ⲿԷ Spring ʱû봴һΪmyTransactionManagerTransactionManager Ȼǵķ transactionManagerʾ£
<bean id="myTransactionManager" class="org.springframework.orm.toplink.TopLinkTransactionManager"> <property name="sessionFactory"> <value>toplinkSessionFactory</value> </property> </bean>
<bean id="serviceRunningInTransaction" class="domain.ServiceImpl"> <property name="transactionManager"> <value>myTransactionManager</value> </property> <property name="dao"> <ref bean="myDao"/> </property> </bean>
÷ʹһж "myDAO" ݷԸ DAO в TopLinkTransactionManager Spring ĵУעѡʹģ߽磬Ựһ Spring AOP ķʽִС˴ûṩģʽض TopLink ϢûӦο Spring ĵ˽顣ȻԵĿǣǽһʾ˵ܹʹ Spring TransactionProxyFactoryBean ķʽȷı߽磺
<bean id="serviceUsingDeclarativeTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="myTransactionManager"/> </property> <property name="target> <ref bean="myService"/> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>
<bean id="myService" class="domain.MyServiceBean"> <property name="dao"> <ref bean="myDAO"/> </property> </bean>
ʵϣĶ彫ʹ Spring ֪ serviceImpl ӿезҪһһѾһ⣬ͨ뿪ʼķض쳣ӦعеķԲ¿ʼķϸֻġңʵʩ "myDAO" TopLink SessionFactoryûаض TopLink Ĵ롣ֻǽҪݷװһ𣬲
"myService" Ҫִ漰ͬ TopLink Session ĸĵIJôûҪ JTA UserTransactionȫ漰ԷõĸġȻʹõ TransactionManager Ҫ·ʽã
<bean id="myTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
ڣ"myService" ʹݷӶ TopLink Session ԴԣҪϸл TransactionManagement ԵĹκ Java 롣ͨʹͬģʽݷͬĻбֿԼɲԡ
ܽ
ǽ TopLink Spring Framework ֮ļɣעĸӦõҪ TopLink Session Сִ֮ʱע뵽ʱϵͳСʹµĴУ
MyTxInterface service = (MyTxInterface) factory.getBean("serviceUsingDeclarativeTransaction");
service.doInTransaction();
ʹܹ磺
- ýػôԴĿʼύ
- öĸݷʼʵʩ
- ݷעȷõ TopLink Session
ûԱдݷʴ룬迼ǻỰΪỰǰԵԶֱǣӶɴӲͬΪɵزݷʴ롣
|