ʲô Spring TopLink ɣ

֪ʹ 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ģִҪĹܣ

  1. ȷ Session ȷãʹȷ
  2. е쳣е쳣תΪ׼ Spring DataAccessException νṹ
  3. һݲɣȷͷеԴҪĻ

ƵأеҲ 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

ûԱдݷʴ룬迼ǻỰΪỰǰ໷ԵԶֱǣӶɴӲͬΪɵزݷʴ롣

寄送此页面
Printer View 打印机视图