spring 2.5 + jpa 1.0 + jsf 1.2

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<!-- bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" / -->

<context:component-scan base-package="xx.yy.locker" />
<context:annotation-config />

<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="locker" />
</bean>

<bean id="transactionManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>

<tx:annotation-driven transaction-manager="transactionManager" />

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*" read-only="false" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="lockerManagerOperation" expression="execution(public * xx.yy..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="lockerManagerOperation"/>
</aop:config>

</beans>

persistence.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="testDB" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/xx</jta-data-source>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.connection.driver_class"
value="oracle.jdbc.pool.OracleConnectionPoolDataSource" />
<!-- property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory" / -->
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
</properties>
</persistence-unit>
</persistence>

libs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
antlr-2.7.6.jar
aspectjrt.jar
aspectjweaver.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar
dom4j-1.6.1.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
hibernate3.jar
javassist-3.4.GA.jar
common-annotations.jar
log4j-1.2.16.jar
persistence.jar
slf4j-api-1.5.0.jar
slf4j-log4j12-1.5.0.jar
spring-2.5.jar

注意:

  1. 使用<context:component-scan><context:annotation-config />的话,可以不用
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
  2. 使用<tx:annotation-driven> + <tx:advice> + <aop:config> 可以不用 @transactional
  3. WAS的TransactionManager要用WebSphereUowTransactionManager
  4. hibernate.transaction.manager_lookup_class 用 org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
  5. hibernate.transaction.factory_class 不能使用 org.hibernate.transaction.CMTTransactionFactory,因为WAS的transaction不是一个joinableTransaction,所以只能使用org.hibernate.transaction.JDBCTransactionFactory
  6. 删除WEB-INF/lib中的jta.jar,否则会出现错误。估计这个jta.jar跟WAS的有版本不兼容问题。
  7. JSF集成spring
    web.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
     <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    faces-config.xml
    <faces-config>
    <application>
    <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
    </application>
    </faces-config>
    这样就不用写Managed-Bean,但EL不能获得managedBean的数据,只能用JSF的EL读取managedBean,
    即不能${xBean},只能#{xBean}
  8. <context:annotation-config />支持JSR-250 annotations,即 @Resource, @PostConstruct, @PreDestroy。
    等价于<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    而CommonAnnotationBeanPostProcessor支持 @EJB

参考:

http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html

中文: