JSF Spring 3项目中的事务控制

JSF Spring 3项目中的事务控制,spring,hibernate,jsf,transactions,Spring,Hibernate,Jsf,Transactions,我在使用JSF2.0和Primefaces、Spring3和Hibernate的项目中遇到了一个问题。 我能够正确地配置整个项目,并且能够很好地使用spring的依赖注入和事务控制以及JSF视图、服务(接口和impl)、DAO(接口和impl)。 但是,每当我尝试列出或删除某个模型的对象时,它都会复制模型表中的当前对象。 以前有人有过这个问题吗? PS:我用@Component(“myBeanName”)注释我的控制器类,这样我的jsf视图就可以理解bean名称来调用方法和使用对象 这是appl

我在使用JSF2.0和Primefaces、Spring3和Hibernate的项目中遇到了一个问题。 我能够正确地配置整个项目,并且能够很好地使用spring的依赖注入和事务控制以及JSF视图、服务(接口和impl)、DAO(接口和impl)。 但是,每当我尝试列出或删除某个模型的对象时,它都会复制模型表中的当前对象。 以前有人有过这个问题吗? PS:我用@Component(“myBeanName”)注释我的控制器类,这样我的jsf视图就可以理解bean名称来调用方法和使用对象

这是applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<context:component-scan base-package="br.com.dentrio" />
<context:annotation-config />
<context:spring-configured />

<!-- Data Source Declaration -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dentriodb" />
    <property name="user" value="root" />
    <property name="password" value="root" />
    <property name="maxPoolSize" value="10" />
    <property name="maxStatements" value="0" />
    <property name="minPoolSize" value="5" />
</bean>

<!-- Session Factory Declaration -->
<bean id="SessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- <property name="packagesToScan"> <list>     <value>net.javabeat.spring.model</value> 
        </list> </property> -->
    <property name="packagesToScan" value="br.com.dentrio.model"></property>
    <!-- <property name="annotatedClasses"> -->
    <!-- <list> -->
    <!-- <value>net.javabeat.spring.model.*</value> -->
    <!-- </list> -->
    <!-- </property> -->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
</bean>

<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />

<!-- Transaction Manager is defined -->
<bean id="txManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>

org.hibernate.dialogue.mysql5dialogue
真的
更新
真的

My faces-config.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">

<application>
    <locale-config>
        <default-locale>pt_BR</default-locale>
    </locale-config>
</application>

<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

<application>
    <message-bundle>
        messages
    </message-bundle>
 </application>

pt_BR
org.springframework.web.jsf.el.SpringBeanFacesELResolver
信息

My web.xml

<?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_2_5.xsd"
id="WebApp_ID" version="2.5">

<display-name>PrimeFaces Web Application</display-name>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-       class>
</listener>
<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>

<!-- Welcome page -->
<welcome-file-list>
    <welcome-file>home.xhtml</welcome-file>
</welcome-file-list>

<!-- JSF mapping -->
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- Map these files with JSF -->
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

</web-app>

PrimeFaces Web应用程序
上下文配置位置
/WEB-INF/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
javax.faces.PROJECT_阶段
发展
home.xhtml
Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
/面孔/*
Facesservlet
*.jsf
Facesservlet
*.面孔
Facesservlet
*.xhtml
我的Bean控制器

package br.com.managedController;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.view.ViewScoped;

import org.springframework.dao.DataAccessException;

import br.com.dentrio.comum.BaseBean;
import br.com.dentrio.model.Dentista;
import br.com.dentrio.service.DentistaServiceImpl;

@Component("dentistaBean")
public class DentistaBean extends BaseBean implements Serializable {

private static final long serialVersionUID = 1L;

@Autowired
DentistaService dentistaService;

private Date data;
private Dentista dentista = new Dentista();
private Dentista dentistaSelecionado;
List<Dentista> listaDentistas = new ArrayList<Dentista>();

public void prepararPedidos() {
carregarListaDentistas();
}

@PostConstruct
private void carregarListaDentistas() {
listaDentistas = new ArrayList<Dentista>();
listaDentistas.addAll(dentistaService.listDentistas());
}

public String adicionarDentista() {
try {
    dentistaService.addDentista(dentista);
    carregarListaDentistas();
    addMessage("Sucesso", "Dentista adicionado com Sucesso!");
    return "listarDentistas?faces-redirect=true";

} catch (DataAccessException e) {
    e.printStackTrace();
}
return ERROR;
}

public void deletarDentista(Integer dentistaId) {
try {
    Dentista dentista = dentistaService.getDentista(dentistaId);
    dentistaService.deletarDentista(dentista);
    addMessage("Sucesso", "Dentista deletado com Sucesso!");
    carregarListaDentistas();
} catch (Exception e) {
    e.printStackTrace();
}
}

public void resetForm() {
dentista = new Dentista();
}

public Dentista getDentista() {
return dentista;
}

public void setDentista(Dentista dentista) {
this.dentista = dentista;
}

public Date getData() {
return data;
}

public void setData(Date data) {
this.data = data;
}

public List<Dentista> getListaDentistas() {
return listaDentistas;
}

public void setListaDentistas(List<Dentista> listaDentistas) {
this.listaDentistas = listaDentistas;
}

public Dentista getDentistaSelecionado() {
return dentistaSelecionado;
}

public void setDentistaSelecionado(Dentista dentistaSelecionado) {
this.dentistaSelecionado = dentistaSelecionado;
}

public DentistaService getDentistaService() {
return dentistaService;
}

public void setDentistaService(DentistaService dentistaService) {
this.dentistaService = dentistaService;
}
}
package br.com.managedController;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ManagedProperty;
导入javax.faces.view.ViewScoped;
导入org.springframework.dao.DataAccessException;
导入br.com.dentrio.comum.BaseBean;
导入br.com.dentrio.model.Dentista;
导入br.com.dentrio.service.DentistaServiceImpl;
@组件(“dentistaBean”)
公共类DentistaBean扩展BaseBean实现可序列化{
私有静态最终长serialVersionUID=1L;
@自动连线
牙医服务;;
私人日期数据;
私人牙医=新牙医();
私人牙医;
List listaDentistas=new ArrayList();
公共无效预处理程序pedidos(){
Carregarlistatististas();
}
@施工后
私人空置卡雷加利牙医(){
listaDentistas=newarraylist();
addAll(dentistaService.listDentistas());
}
公共字符串adicionarDentista(){
试一试{
牙医服务。添加牙医(牙医);
Carregarlistatististas();
添加消息(“Sucesso”,“Dentista adicionado com Sucesso!”);
返回“listarDentistas?faces redirect=true”;
}捕获(数据访问异常){
e、 printStackTrace();
}
返回误差;
}
公共void deletarDentista(整数dentistaId){
试一试{
Dentista Dentista=牙医服务。getDentista(dentistaId);
牙科医生服务。牙科医生(牙科医生);
addMessage(“Sucesso”,“Dentista deletado com Sucesso!”);
Carregarlistatististas();
}捕获(例外e){
e、 printStackTrace();
}
}
公共表格(){
牙医=新牙医();
}
公共牙医{
回归牙医;
}
公共牙科医生(牙科医生){
这个。牙医=牙医;
}
公共日期getData(){
返回数据;
}
公共无效设置数据(日期数据){
这个数据=数据;
}
公共列表getListaDentistas(){
返回列表状态;
}
公共无效集合列表数据集(列表数据集){
this.listaDentistas=listaDentistas;
}
公共牙医{
返回牙医诊所;
}
公共无效设置牙科医生selecionado(牙科医生selecionado){
this.dentistaseleconado=dentistaseleconado;
}
公共牙医服务{
返回牙医服务;
}
公共无效设置DestinstaService(DestinstaService DestinstaService){
this.dentistaService=牙医服务;
}
}

我要做的是将Spring服务作为托管属性注入JSFbean中。您可以毫无问题地使用@ViewScoped

@ViewScoped
public class bean{

@ManagedProperty(value="#{springService}")
private SpringService springService;
//getter and setter

请提供您的源代码更新代码在这里。。。如果您需要其他文件,我可以把它们发布在这里,比如服务接口和impl类或DAOsAnyone???我想可能是spring事务错误或idk。问题是我的@Transactional注释,它放错了地方。无论如何,谢谢你的回答