!!!Key / Id Property ermitteln {{{ Session session = (Session)entityManager.getDelegate(); ClassMetadata metadata = session.getSessionFactory().getClassMetadata(type); String keyName = metadata.getIdentifierPropertyName(); Class<?> keyType = metadata.getIdentifierType().getReturnedClass(); }}} !!!Spring JPA applicationContext.xml: {{{ <context:component-scan base-package="com.intersult"/> <aop:config proxy-target-class="true"/> <aop:aspectj-autoproxy/> <bean id="dataSource" class="${dataSource.class}" destroy-method="close"> <property name="URL" value="${dataSource.url}"/> <property name="user" value="${dataSource.username}"/> <property name="password" value="${dataSource.password}"/> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <tx:annotation-driven/> }}} !!!Spring Open EntityManager once in View Pattern web.xml: {{{ <filter> <filter-name>EntityManagerFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>EntityManagerFilter</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> }}} !!!Spring Open EntityManager in Session Nicht getestet ob das praktikabel ist. {{{ public class OpenEntityManagerInSessionFilter extends OncePerRequestFilter { public static final String ENTITY_MANAGER_FACTORY_NAME = "entityManagerFactory"; public static final String ENTITY_MANAGER_NAME = "entityManager"; private String entityManagerFactoryBeanName = ENTITY_MANAGER_FACTORY_NAME; public void setEntityManagerFactoryBeanName(String entityManagerFactoryBeanName) { this.entityManagerFactoryBeanName = entityManagerFactoryBeanName; } public String getEntityManagerFactoryBeanName() { return entityManagerFactoryBeanName; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { EntityManagerFactory entityManagerFactory = lookupEntityManagerFactory(); boolean participate = false; try { if (TransactionSynchronizationManager.hasResource(entityManagerFactory)) { participate = true; } else { EntityManager entityManager = (EntityManager)request.getSession().getAttribute(ENTITY_MANAGER_NAME); if (entityManager == null) { entityManager = entityManagerFactory.createEntityManager(); request.getSession().setAttribute(ENTITY_MANAGER_NAME, entityManager); } TransactionSynchronizationManager.bindResource( entityManagerFactory, new EntityManagerHolder(entityManager)); } filterChain.doFilter(request, response); } finally { if (!participate) TransactionSynchronizationManager.unbindResource(entityManagerFactory); } } protected EntityManagerFactory lookupEntityManagerFactory() { WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); return (EntityManagerFactory) wac.getBean(getEntityManagerFactoryBeanName(), EntityManagerFactory.class); } } }}} !!!Criteria Query In Hibernate sind die Criteria Querys eine der mächstigsten Instrumente, da sie rein durch ein Programm erzeugt werden können. {{{ Criteria criteria = ((Session)entityManager.getDelegate()).createCriteria(Rule.class); ProjectionList projections = Projections.projectionList(); projections.add(Projections.alias(Projections.groupProperty(selector.property()), "goal")); projections.add(Projections.alias(Projections.rowCount(), "count")); criteria.setProjection(projections); criteria.add(Restrictions.like(selector.property(), text, MatchMode.ANYWHERE)); criteria.addOrder(Order.desc("count")); criteria.setMaxResults(5); criteria.setResultTransformer(Transformers.aliasToBean(Suggestion.class)); return criteria.list(); }}} !!!UserType Durch Implementieren von org.hibernate.usertype.UserType können Mapper für [eigene Datentypen|Hibernate EnumSet] geschrieben werden. Hibernate konvertiert diese dann von/zu primitiven Datenbanktypen. Ein UserType kann auch automatisch angewandt werden, indem er mit entsprechenden Annotationen versehen wird: {{{ @MappedSuperclass @TypeDef(defaultForType = EnumSet.class, typeClass = EnumSetType.class) public class EnumSetType<Type extends Enum<Type>> implements UserType, ParameterizedType { ... } }}}