大佬教程收集整理的这篇文章主要介绍了实体不存在-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&@ 注释的 它 。因此,没有交易。诀窍(而是正确的方法)是通过以下方式更改我的配置文件:
<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,请注明来意。