标签: spring-orm

Spring AMQP/RabbitMQ和Hibernate Transaction Mananger

我有一个使用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代理.

rabbitmq spring-transactions spring-orm spring-amqp

5
推荐指数
1
解决办法
1542
查看次数

Spring 3.1 和 JPA 2 没有正在进行的事务异常

我一直在这几个星期。我已经尝试过 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&#59; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress …
Run Code Online (Sandbox Code Playgroud)

spring jpa-2.0 spring-orm

5
推荐指数
1
解决办法
1万
查看次数

每个实体一个 DAO - 如何处理引用?

我正在编写一个具有典型两个实体的应用程序:用户和用户组。后者可能包含前者的一个或多个实例。我有以下(更多/更少)映射:

用户:

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)

java spring jpa entitymanager spring-orm

5
推荐指数
1
解决办法
1747
查看次数

休眠@Version注解

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)

java hibernate hibernate-mapping spring-orm

5
推荐指数
0
解决办法
2万
查看次数

org.hibernate.hql.internal.ast.QuerySyntaxException:EdbmsEmployee未映射[来自edbmsEmployee.employeeid =?

我正在做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)

spring hibernate hibernate-mapping spring-orm

5
推荐指数
1
解决办法
1万
查看次数

在Spring4.2.0中不支持iBatis

在Spring4.2.0中不支持ibatis.我的项目是从Spring 3.2.4升级到Spring 4.2.当我用Google搜索时,我发现了与mybatis的spring4.2集成示例,但没有使用ibatis.有人可以帮助我如何添加ibatis支持吗?

ibatis spring-orm

5
推荐指数
1
解决办法
3298
查看次数

QueryDSL返回最大值

我想使用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)

java hibernate jpa querydsl spring-orm

5
推荐指数
1
解决办法
9841
查看次数

Spring Transactional减慢了整个过程

我试图分析一下我有两个班级的情况.一个类是ProcessImpl,它是起点并在内部调用其他子事务.我不知道什么是错误的.processImpl正在导入一些东西并将相关数据写入数据库.

眼镜

Spring-orm版本:3.2.18.RELEASE.

JDK版本:1.8.

Db:H2(记录任何db相同的性能).

问题

如果我@TransactionalProcessImpl.processStage()过程中删除需要~50秒 如果我保持@TransactionalProcessImpl.processStage()过程需要〜15分钟.不知道为什么会这样.我一直试图解决这个问题,但没有运气.请看下面的代码.

要求: 完成processStage()应完成或完全回滚,即使其中一个子事务失败.

Fyi:我也收到很多消息:"参与现有交易".试图通过添加propagation=Propagation.NESTEDprocessStage()但没有工作来克服这个问题.

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)

java spring transactions transactional spring-orm

5
推荐指数
1
解决办法
1627
查看次数

bean类的无效属性"packagesToScan"[org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]

我试图找到解决方案,但仍然没有运气.

我正在关注"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)

configuration spring packages spring-orm spring-data-jpa

4
推荐指数
1
解决办法
1万
查看次数

为什么openSession不起作用,但getCurrentSession在Spring Hibernate中工作

我已经编写了一个示例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)

java hibernate spring-orm hibernate-4.x

4
推荐指数
1
解决办法
5927
查看次数

关于通过Hibernate保存实体的org.hibernate.WrongClassException

在这个问题中,我正在使用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 spring hibernate jpa spring-orm

2
推荐指数
1
解决办法
3874
查看次数

用于访问多个客户端的嵌入式 Derby DB

我编写基于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)

hibernate derby embedded-database spring-orm java-8

2
推荐指数
1
解决办法
1253
查看次数