Hi,
I'm new here and I'm looking for help.
I have a application with JSF+Hibernate/JPA+SPRING, I'm having several problems when I try to persist/save a entity (ex: lazyloading-session closed-invalid data acess, etc...).
I'll post bellow the way that my application is...I think it will be more easy for you guys to understand and help me..
Here my DAO.
Here my DaoImpl:package dao;
import java.io.Serializable;
import java.util.List;
public interface Dao<T, ID extends Serializable> {
T loadById(ID id);
void persist(T entity);
void update(T entity);
void delete(T entity);
List<T> loadAll();
}
package dao.impl;
import java.io.Serializable;
import java.util.List;
import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transac tional;
import dao.Dao;
@Repository
public abstract class DaoImpl<T, ID extends Serializable> implements
Dao<T, ID> {
private Class<T> persistentClass;
@PersistenceContext
protected EntityManager entityManager;
@SuppressWarnings("unchecked")
public DaoImpl() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public Class<T> getPersistentClass() {
return persistentClass;
}
@Transactional(readOnly = true)
public T loadById(ID id) {
return entityManager.find(persistentClass, id);
}
@Transactional
public void persist(T entity) {
entityManager.persist(entity);
}
@Transactional
public void update(T entity) {
entityManager.merge(entity);
}
@Transactional
public void delete(T entity) {
Object o = entityManager.merge(entity);
entityManager.remove(o);
}
@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
public List<T> loadAll() {
return entityManager.createQuery(
"Select t from " + persistentClass.getSimpleName() + " t")
.getResultList();
}
}
This is how I implement my especific entities:
DAO
DaoIMpl:package dao;
import model.Produtor;
public interface ProdutorDao extends Dao<Produtor, Long> {
Produtor procurarProdutor(String nome);
}
Here applicationContext:package dao.impl;
import java.util.List;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transac tional;
import dao.ProdutorDao;
import model.Produtor;
@Repository("produtorDao")
public class ProdutorDaoImpl extends DaoImpl<Produtor, Long> implements
ProdutorDao {
@Transactional(readOnly = true)
public Produtor procurarProdutor(String nome) {
String queryString = "from Produtor p where p.nome like ?1";
Query q = entityManager.createQuery(queryString).setParamete r(1, nome);
@SuppressWarnings("unchecked")
List<Produtor> uList = q.getResultList();
if(uList.isEmpty())
return null;
else
return uList.get(0);
}
}
Here facesConfig:<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/schem...-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schem...ontext-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- Loads -->
<contextroperty-placeholder location="classpath:application.properties" />
<!-- -->
<!-- Data Sources and EntityManagers JPA -->
<!-- Data Source One -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverM anagerDataSource">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</bean>
<!-- EntityManager One -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerE ntityManagerFactoryBean">
<property name="persistenceUnitName" value="tcc" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.Hibernat eJpaVendorAdapter">
<property name="databasePlatform" value="${jdbc.dialect}" />
<property name="showSql" value="${jdbc.showSql}" />
</bean>
</property>
</bean>
<!-- -->
<!-- Enable @Transactional -->
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionM anager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- -->
<!-- Scan all Components -->
<context:component-scan base-package="*" />
<!-- -->
<!-- Inject Entity Managers into @PersistenceContext -->
<bean
class="org.springframework.orm.jpa.support.Persist enceAnnotationBeanPostProcessor" />
<!-- -->
<!-- Error Handler for JPA -->
<bean
class="org.springframework.dao.annotation.Persiste nceExceptionTranslationPostProcessor" />
<!-- -->
<!-- Auto-wire beans with @Autowired and @Resource -->
<bean
class="org.springframework.beans.factory.annotatio n.AutowiredAnnotationBeanPostProcessor" />
<!-- -->
<!-- View Scope -->
<bean class="org.springframework.beans.factory.config.Cu stomScopeConfigurer">
<property name="scopes">
<map>
<entry key="view">
<bean class="outros.ViewScope" />
</entry>
</map>
</property>
</bean>
<!-- -->
</beans>
Here web.xml:<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<!-- Messages -->
<application>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>en_US</supported-locale>
</locale-config>
<resource-bundle>
<base-name>messages</base-name>
<var>msgs</var>
</resource-bundle>
</application>
<!-- -->
<!-- Resolve EL beans from Spring -->
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBean FacesELResolver</el-resolver>
</application>
<!-- -->
</faces-config>
Here's my controller that I use as a Bean in JSF...here I try to persist/save and is here that I'm getting the errors. I'll post just some parts because is very huge:<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- Welcome Files -->
<welcome-file-list>
<welcome-file>login.xhtml</welcome-file>
</welcome-file-list>
<!-- -->
<!-- Configuration JSF -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- -->
<!-- Support Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoade rListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- Enable Scope -->
<listener>
<listener-class>
org.springframework.web.context.request.RequestCon textListener</listener-class>
</listener>
<!-- -->
</web-app>
As you can see I have a method named 'salvar' that I call to persit the entity, but its not working, I think is because I have others entities in this entity, (relations like one-to-many, many-to-many.....).package controller;
@Controller
@Scope("view")
public class CriarBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* PRODUTOR
*/
private ProdutorDao produtorDao;
@Resource
public void setProdutorDao(ProdutorDao produtorDao){
this.produtorDao = produtorDao;
}
private Produtor produtor = new Produtor();
public Produtor getProdutor() {
return this.produtor;
}
/**
* ESCOLARIDADE PRODUTOR
*/
private EscolaridadeDao escolaridadeDao;
@Resource
public void setEscolaridadeDao(EscolaridadeDao escolaridadeDao) {
this.escolaridadeDao = escolaridadeDao;
}
...........
..........
private void salvar(){
this.produtorDao.persist(this.produtor);
}
................
So , my question is: What is the right way to do this (CRUD) in my case?
thanks,
and have a good day.
Filipe.



roperty-placeholder location="classpath:application.properties" />
Reply With Quote
