程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了实体不存在-spring+hibernate+ JPA大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决实体不存在-spring+hibernate+ JPA?

开发过程中遇到实体不存在-spring+hibernate+ JPA的问题如何解决?下面主要结合日常开发的经验,给出你关于实体不存在-spring+hibernate+ JPA的解决方法建议,希望对你解决实体不存在-spring+hibernate+ JPA有所启发或帮助;

好的,我知道了问题所在。我花了很长时间才弄清楚这一点,与我的数据库配置无关,所以我想为遇到类似问题的人们提供帮助。

Spring文档指出以下内容:

我的原始帖子中没有发布的是我的Servlet定义,其中包含以下几行配置代码:

@H_597_2@myServlet.xml

<context:Annotation-config /> 
<context:component-scan base-package="com.myDomain.*" />

这会将所有带注释的Bean(包括控制器,服务和存储库)带入Servlet上下文而不是应用程序上下文。问题就在这里。当Spring寻找用@transactional注释的bean(由于<tx:Annotation- driven/>config.xml文件中存在)时,它将在应用程序上下文中寻找它们。而且,根据我在上一个线程中发布的配置,没有将任何bean加载到我的应用程序上下文中……它们都在servlet上下文中。因此,当我的servlet调用以@service&@ 注释的 它 。因此,没有交易。诀窍(而是正确的方法)是通过以下方式更改我的配置文件:

@H_597_2@myServlet.xml

<context:Annotation-config /> 
<context:component-scan base-package="com.myDomain.servlets" />

config.xml

<context:Annotation-config /> 
<context:component-scan base-package="com.myDomain.dao" /> 
<context:component-scan base-package="com.myDomain.services" />

此配置确保所有Controller都存在于servlet上下文中,而transactional services和Repository存在于 _它们所属_的应用程序上下文中。最后,经过许多不眠之夜,我的数据库写操作仍在继续。

解决方法

我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@transactional注释的服务类。它使用包含注入的Entitymanager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLscheR_908_11845@a-instance"
    xsi:scheR_908_11845@aLOCATIOn="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="pu">
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.InformixDialect" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.showsql" value="true" />
            <property name="hibernate.cache.use_second_level_cache"
                value="false" />
        </properties>
    </persistence-unit>

config.xml

<beans xmlns="http://www.springframework.org/scheR_908_11845@a/beans"
    xmlns:security="http://www.springframework.org/scheR_908_11845@a/security"
    xmlns:xsi="http://www.w3.org/2001/XMLscheR_908_11845@a-instance" 
    xmlns:tx="http://www.springframework.org/scheR_908_11845@a/tx"
    xmlns:p="http://www.springframework.org/scheR_908_11845@a/p"
    xmlns:context="http://www.springframework.org/scheR_908_11845@a/context"
    xsi:scheR_908_11845@aLOCATIOn="http://www.springframework.org/scheR_908_11845@a/beans
                http://www.springframework.org/scheR_908_11845@a/beans/spring-beans-3.0.xsd
                http://www.springframework.org/scheR_908_11845@a/tx http://www.springframework.org/scheR_908_11845@a/tx/spring-tx-3.0.xsd
                http://www.springframework.org/scheR_908_11845@a/aop http://www.springframework.org/scheR_908_11845@a/aop/spring-aop-3.0.xsd
                http://www.springframework.org/scheR_908_11845@a/security
                http://www.springframework.org/scheR_908_11845@a/security/spring-security-3.0.3.xsd
                http://www.springframework.org/scheR_908_11845@a/context http://www.springframework.org/scheR_908_11845@a/context/spring-context-2.5.xsd">

    <bean id="datasource" class="org.apache.commons.dbcp.basicDatasource"
        destroy-method="close">
        <property name="driverClassName" value="org.POSTGResql.Driver" />
        <property name="url" value="jdbc:POSTGResql://localhost:5432/testdb" />  
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean>

    <bean id="entitymanagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntitymanagerFactoryBean">
        <property name="persistenceUnitName" value="pu" />
        <property name="datasource" ref="datasource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.POSTGReSQLDialect" />
            </bean>
        </property>
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.instrumentationLoadTimeWeaver"/>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpatransactionManager"
        p:entitymanagerFactory-ref="entitymanagerFactory" />

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

    <tx:Annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    <context:Annotation-config/>
    </beans>

Accountservice.java

@service("accountservice")
@transactional(propagation=Propagation.requIRED)
public class Accountservice {

    private static final Logger log = Logger.getLogger(Accountservice.class);

    @Autowired
    private UserDAO userDAO;

    public void activateUser(String username,String activationCodE) {
        PendingActivation pendingActivation = userDAO.getPendingActivation(
                username,activationCodE);

            Client client = pendingActivation.getClient();

            if (!userDAO.removePendingActivation(pendingActivation)) {
                log.warn("Unable to remove pending activation");
            }

            if (!userDAO.enableUser(client)) {
                log.error("Unable to enable client");
                return;
            }

            return;
        }
    }

UserDAOImpl.java

@Repository("userDAO")
public class UserDAOImpl implements UserDAO,serializable {

    private static final long serialVersionUID = 1L;

    private static Logger log = Logger.getLogger(UserDAOImpl.class);

    @PersistenceContext
    Entitymanager em;

    @Override 
    public PendingActivation getPendingActivation(String username,String activationCodE) {
        Query q = em.createnamedQuery("getActivationCode")
            .setParameter("activationCode",activationCodE);

        PendingActivation pendingActivation = null;
        try {
            pendingActivation = (PendingActivation)q.getSingleResult();
            return pendingActivation;
        }
        catch (Exception E) {
            log.warn("Could not retrieve activation code " + activationCode + " for user " + username,E);
            return null;
        }
    }

    @Override
    public Boolean enableUser(Client client) {

        try {
            client.setEnabled(true);
            client = em.merge(client);   // this never generates an update
        }
        catch(Exception E) {
            log.error("Unable to enable client: " + client.getUsername(),E);
            return false;
        }

        return true;
    }

    @Override
    public Boolean removePendingActivation(PendingActivation pendingActivation) {
        try {
            pendingActivation = (PendingActivation)em.getReference(PendingActivation.class,pendingActivation.getPendingActivationId());
            em.remove(pendingActivation);  // this never generates a delete
        }
        catch(Exception E) {
            log.warn("Unable to remove activation: " + pendingActivation.getActivationCode(),E);
            return false;
        }

        return true;
    }
}

AccountActivationController.java

@Controller
public class AccountActivationController {

    @Autowired
    @Qualifier("accountservice")
    Accountservice accountservice;

    @requestMapping("activate.do")
    public String doActivate(
            @requestParam("activationCode") String activationCode,@requestParam("username") String username,ModelMap model) {

        UnitCriteria unitCriteria = accountservice.activateUser(username,activationCodE);

        if (unitCriteria == null) {
            return "account/activationError";
        }

        model.addAttribute("fromActivation",truE);
        return "forWARD:search.do?" + unitCriteria.toUrlParams(true);
    }

}

大佬总结

以上是大佬教程为你收集整理的实体不存在-spring+hibernate+ JPA全部内容,希望文章能够帮你解决实体不存在-spring+hibernate+ JPA所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。