layout="pageDirection | lineDirection"
pageDirection=display radio buttons vertically on the page
lineDirection=display inline
Articles, notes and random thoughts on Software Development and Technology
layout="pageDirection | lineDirection"
pageDirection=display radio buttons vertically on the page
lineDirection=display inline
It seems that @Schedule methods won’t execute on JBoss AS7.1 unless you specify at least both the hours and minutes values on the scheduled method.
For example, to execute a method every 30 seconds:
@Schedule(seconds="*/30") public void doSomething() { ...}
Doesn’t execute, but if you include hours and minutes wildcards too then it does:
@Schedule(hour="*", minute-="*", second="*/30") public void doSomething() { ...}
Spring Expression Language (SpEL) introduced in Spring 3.0 introduces EL style language for referencing beans and properties, and gives a standard syntax for doing property replacement into beans.
Enabled with context:component-scan in xml file:
<context:component-scan base-package="your.package"/>
‘The spirit of autowiring is by type’ – use of the @Qualifier should be only if necessary, since it restricts the flexibility and power of the Autowiring.
Use of @Autowired implies @Required (don’t need to explicitly defined @Required if @Autowired)
Also enabled via context:component-scan
Following stereotypes do add extra behavior:
Other Spring projects use similar annotation approach for adding additional stereotype based functionality.
Spring JUnit Support
Integration testing support allows testing with Spring Bean dependencies
@ContextConfuguration("example-context.xml") @RunWith(SpringJUnit4ClassRunner.class) public class ExampleTest { @Autowired private ExampleService exampleService; @Test public void eampleTest() { ... } }
Configure beans for your datasource, transaction manager and the SessionFactory:
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myds"/> <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="myDataSource"/> <property name="jtaTransactionManager" ref="txManager"/> <property name="mappingResources"> <list> <value>product.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.HSQLDialect </value> </property> </bean>
Configuring with xml files is optional if you’re using JPA annotations for your Entities instead.
Repositories using Hibernate follow same ‘new’ pattern as JDBC Template with Spring 3.x, no longer user the HibernateTemplate, inject a Hibernate SessionFactory and use this to get a Session directly. This approach doesn’t have any Spring code dependencies:
@Transactional @Repository public class ExampleRespositoryImpl implements ExampleRepository { private SessionFactory sessionFactory; public ExampleRespositoryImpl(SessionFactory sessionFactory) { this.sessionFactory(sessionFactory); } public Example findExampleById(Long id) { this.sessionFactory.getCurrentSession().get(Example.class, id); } }
Running in an EE container, configure your datasource, transaction manager and EntityManagerFactoryBean:
<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/MysqlDS"/> <bean id="transactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/persistenceUnit"/>
If you’re running outside of an EE container, instead of looking up your datasource and container provided EntityManagerFactory, define a LocalEntityMangerFactoryBean, referencing your persistence unit name:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> <property name="persistenceUnitName" value="persistenceUnit"/> <property name="dataSource" ref="dataSource"/> </bean>
Configure your persistence.xml to reference your datasource and JPA provider (which may also be Hibernate):
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="persistenceUnit" transaction-type="JTA"><!-- for local testing use: RESOURCE_LOCAL --> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- KH: look up DataSource from container --> <jta-data-source>java:jboss/datasources/MysqlDS</jta-data-source> <properties> <!-- KH: ask JBoss to publish the EntityManager so we can reference it in the Spring config --> <property name="jboss.entity.manager.factory.jndi.name" value="persistence/persistenceUnit"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database --> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> <property name="hibernate.connection.charSet" value="UTF-8"/> </properties> </persistence-unit> </persistence>
If you’re running outside of an EE container, make the following changes:
transaction-type="RESOURCE_LOCAL"
Write Repositories with @Repository and @Transactional, and use the @PuersistenceUnit annotation to inject the EntityManagerFactory
@Transactional @Repository public class ExampleRespositoryImpl implements ExampleRepository { private EntityManagerFactory emf; @PersistenceUnit public void setEntityManagerFactory(EntityManagerFactory emf) { this.emf = emf; } public Collection loadProductsByCategory(String category) { EntityManager em = this.emf.createEntityManager(); try { Query query = em.createQuery("from Product as p where p.category = ?1"); query.setParameter(1, category); return query.getResultList(); } finally { if (em != null) { em.close(); } } } }
This approach injects the EntityManagerFactory using @PersistenceUnit, from which you can get hold of the EntityManager. The normal approach with JPA would be to inject the EntityManager with @PersistenceContext and use the EntityManager directly.