我有一个使用Hibernate和PostgreSQL的Spring应用程序.它还使用Spring AMQP(RabbitMQ).
我使用Hibernate事务管理器配置如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" p:dataSource-ref="dataSource" />
Run Code Online (Sandbox Code Playgroud)
我正在使用SimpleMessageListenerContainer进行异步消息接收,配置如下:
@Resource(name="transactionManager")
private PlatformTransactionManager txManager;
@Autowired
private MyListener messageListener;
@Bean
public SimpleMessageListenerContainer mySMLC()
{
final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory);
container.setQueueNames("myQueue");
final MessageListenerAdapter adapter = new MessageListenerAdapter(messageListener);
adapter.setMessageConverter(converter);
container.setMessageListener(adapter);
container.setChannelTransacted(true);
container.setTransactionManager(txManager);
return container;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我已经指定消息的接收需要是事务性的.消息侦听器调用一个服务,该服务可以使用@Transactional注释方法,并可能在数据库上执行CRUD操作.
我的问题是,使用HibernateTransactionManager来管理SimpleMessageListenerContainer级别的事务是否存在问题?使用数据库事务管理器包装从RabbitMQ接收消息会有任何问题吗?
我不期待XA在这里.我只想确保如果服务对数据库的任何操作失败,则消息不会被送到RabbitMQ代理.
我一直在这几个星期。我已经尝试过 eclipselink,现在只是普通的 JPA。我一直遇到同样的问题。每次我尝试刷新我的实体管理器时,我都会收到“javax.persistence.TransactionRequiredException: no transaction is in progress”异常。我知道这与我如何连接所有东西有关,但我无法弄清楚。
我曾尝试编写 JUnit 测试进行测试,但由于我是 spring 的新手,因此有一组完全不同的问题。
需要注意的一些事情: 我没有使用persistence.xml,因为我使用的是spring 3.1 * App Server: WebSphere 8.5 (Liberty Profile) *
例外
[ERROR ] SRVE0777E: Exception thrown by application class 'org.springframework.web.servlet.FrameworkServlet.processRequest():894'
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1221)
at [internal classes]
[ERROR ] SRVE0315E: An execption occurred: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress …Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有典型两个实体的应用程序:用户和用户组。后者可能包含前者的一个或多个实例。我有以下(更多/更少)映射:
用户:
public class User {
@Id
@GeneratedValue
private long id;
@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="GROUP_ID")
private UserGroup group;
public UserGroup getGroup() {
return group;
}
public void setGroup(UserGroup group) {
this.group = group;
}
}
Run Code Online (Sandbox Code Playgroud)
用户组:
public class UserGroup {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy="group", cascade = {CascadeType.REMOVE}, targetEntity = User.class)
private Set<User> users;
public void setUsers(Set<User> users) {
this.users = users;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我为每个实体(UserDao 和 UserGroupDao)都有一个单独的 DAO 类。我所有的 DAO 都使用 @PersistenceContext 注释注入了 EntityManager,如下所示:
@Transactional
public class SomeDao<T> { …Run Code Online (Sandbox Code Playgroud) hibernate @version 和 ManyToOne Mapping 之间的关系是什么。
假设我有两个表部门和员工。这里 Deparment 是主表,而 Employee 是明细表。在Employee表中,departmentID作为外键被引用。
这是我的课
Public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long ID;
@Version
private Long version;
//Getters and Setters
}
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long ID;
@Version
private Long version;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departmentID" )
private Department department;
}
Run Code Online (Sandbox Code Playgroud)
而且,Spring 处理会话。因此,假设在一页中,特定部门被提取并存储在 HTTP 会话中。
现在在另一个页面中,我正在尝试执行以下操作
Employee emp = new Employee();
emp.setName('Test')
emp.setDepartment(dept) // already stored in the HTTP session variable
service.save(emp)
Run Code Online (Sandbox Code Playgroud)
现在我收到以下异常
org.springframework.dao.InvalidDataAccessApiUsageException: …Run Code Online (Sandbox Code Playgroud) 我正在做3春季休眠4和ORM新手.所以低于Exception请帮助.
我知道这个例外的问题已经被问到,但在我的情况下,我在尝试这些解决方案后仍然面临着这个问题.
下面是我的Entity类
package com.aviva.qc.hrms.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="EDBMS_EMPLOYEE")
public class EdbmsEmployee implements Serializable{
@Id
@Column(name="EMPLOYEEID", nullable=false)
private String employeeid;
@Column(name="FIRSTNAME", nullable=false)
private String firstname;
@Column(name="LASTNAME", nullable=false)
private String lastname;
@Column(name="BANDID", nullable=false)
private String bandid;
@Column(name="DOJ", nullable=false)
private String doj;
@Column(name="DOB", nullable=false)
private String dob;
@Column(name="FUNCTIONNAME", nullable=false)
private String functionname;
public String getEmployeeid() {
return employeeid;
}
public void setEmployeeid(String employeeid) {
this.employeeid = employeeid;
}
public String getFirstname() {
return firstname; …Run Code Online (Sandbox Code Playgroud) 在Spring4.2.0中不支持ibatis.我的项目是从Spring 3.2.4升级到Spring 4.2.当我用Google搜索时,我发现了与mybatis的spring4.2集成示例,但没有使用ibatis.有人可以帮助我如何添加ibatis支持吗?
我想使用QueryDSL返回最大值.
使用此查询,我返回eventid等于id的间隔,它正常工作.
QInterval interval = QInterval.interval;
JPAQuery query = new JPAQuery(em);
BooleanExpression checkId = interval.event.eventid.eq(id);
Interval interv = query.from(interval).where(checkId).uniqueResult(interval);
Run Code Online (Sandbox Code Playgroud)
但是如果我这样做并添加这个谓词我会得到一个错误(我想返回具有最大时间时间戳的类End的对象和End的对象:
BooleanExpression getMax = interval.end.timestamp.eq(interval.end.timestamp.max());
Interval interv = query.from(interval).where(getMax).uniqueResult(interval);
Run Code Online (Sandbox Code Playgroud)
我认为问题可能与interval.end.timestamp.max()有关,因为它是一个DateTimeExpression.
错误是 Caused by: java.sql.SQLException: Invalid use of group function:
org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:314)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:225)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:131)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) …Run Code Online (Sandbox Code Playgroud) 我试图分析一下我有两个班级的情况.一个类是ProcessImpl,它是起点并在内部调用其他子事务.我不知道什么是错误的.processImpl正在导入一些东西并将相关数据写入数据库.
眼镜
Spring-orm版本:3.2.18.RELEASE.
JDK版本:1.8.
Db:H2(记录任何db相同的性能).
问题
如果我@Transactional从ProcessImpl.processStage()过程中删除需要~50秒
如果我保持@Transactional从ProcessImpl.processStage()过程需要〜15分钟.不知道为什么会这样.我一直试图解决这个问题,但没有运气.请看下面的代码.
要求:
完成processStage()应完成或完全回滚,即使其中一个子事务失败.
Fyi:我也收到很多消息:"参与现有交易".试图通过添加propagation=Propagation.NESTED到processStage()但没有工作来克服这个问题.
ProcessImpl类.
public class ProcessImpl {
/*This is the big transaction that calls other transactional stuff from MyServiceImpl
* This is starting point you can say for the process...
*
* If we remove @Transactional from here the process is lightning fast
* With transactional : 15minutes
* Without transactional …Run Code Online (Sandbox Code Playgroud) 我试图找到解决方案,但仍然没有运气.
我正在关注"Pro Spring 3"(Appress)[第351页]
我已经将项目生成为jpa项目.
据我所知,我可以使用persistence.xml或者可以在bean内部管理它,这就是我想要的.
对于最新的我们需要定义packagesToScan属性.
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaPersonService': Injection of persistence dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'emf' defined in class path resource [META-INF/app-context.xml]: Error setting property values; nested exception
is **org.springframework.beans.NotWritablePropertyException: Invalid property 'packagesToScan' of bean class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Bean property 'packagesToScan' is not writable or has an invalid setter method. Does the parameter type of the setter match …Run Code Online (Sandbox Code Playgroud) 我已经编写了一个示例Spring Hibernate应用程序o了解Spring hibernate集成的工作原理.
这是我的applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<context:component-scan base-package="com.general" />
<tx:annotation-driven />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="system" />
<property name="password" value="admin_123" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean ">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.general"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
然后,我的服务类就是这样
package …Run Code Online (Sandbox Code Playgroud) 在这个问题中,我正在使用Hibernate 4.3.4.Final和Spring ORM 4.1.2.RELEASE.
我有一个User类,它包含一组这样的CardInstances:
@Entity
@Table
public class User implements UserDetails {
protected List<CardInstance> cards;
@ManyToMany
public List<CardInstance> getCards() {
return cards;
}
// setter and other members/methods omitted
}
@Table
@Entity
@Inheritance
@DiscriminatorColumn(name = "card_type", discriminatorType = DiscriminatorType.STRING)
public abstract class CardInstance<T extends Card> {
private T card;
@ManyToOne
public T getCard() {
return card;
}
}
@Table
@Entity
@Inheritance
@DiscriminatorOptions(force = true)
@DiscriminatorColumn(name = "card_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Card {
// nothing interesting here …Run Code Online (Sandbox Code Playgroud) 我编写基于Java SE 8的桌面应用程序。它有我的应用程序附带的Derby DB (v10.13.1.1)。我使用Hibernate ORM框架 (v5.2.10.Final) 与 DB 进行通信,并使用Spring框架 (spring-orm @ v4.3.7.RELEASE),这也有助于它。
如果我一次将我的应用程序作为一个实例运行,一切都很好 - 数据库不会引起任何问题。但是,如果我创建应用程序的多个实例,或者同时使用数据库客户端 DBeaver 访问数据库,则会导致以下异常:
[AWT-EventQueue-0] DEBUG (124 : 2017-07-28 22:14:57,245) org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Unable to acquire JDBC Connection [n/a]
java.sql.SQLException: Failed to start database 'M_Vezelis_Draw_DB_1_6v.db' with class loader sun.misc.Launcher$AppClassLoader@73d16e93, see the next exception for details.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.bootDatabase(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at org.apache.derby.jdbc.InternalDriver$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at …Run Code Online (Sandbox Code Playgroud) spring-orm ×12
hibernate ×6
java ×6
spring ×6
jpa ×3
derby ×1
ibatis ×1
java-8 ×1
jpa-2.0 ×1
packages ×1
querydsl ×1
rabbitmq ×1
spring-amqp ×1
transactions ×1