【问题标题】:Unable to persist data using Spring + Hibernate无法使用 Spring + Hibernate 持久化数据
【发布时间】:2013-08-02 23:54:43
【问题描述】:

我无法使用 spring 和 hibernate 持久化数据。我查看了各种帖子并尝试了很多东西。但它只是行不通。 我将首先发布我的配置,然后发布我尝试的步骤。将不胜感激。

spring-jpa.xml

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

<bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />

<context:component-scan base-package="com.gamelist.dao.classes" />

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

<tx:annotation-driven transaction-manager="transactionManager"/>

GenericDAO.java

public class GenericDaoJPA<T extends IDomainObject> implements IGenericDao<T> {

protected EntityManager entityManager;

@PersistenceContext
public void setEntityManager(EntityManager entityManager){
    this.entityManager = entityManager;
}

    public void save(T object) throws DataAccessException{
    entityManager.persist(object);
}
.
.
. 
.
}

User.java(域)

@Entity
@Table(name = "user")
public class User implements Serializable, IDomainObject{
private long id;
private String firstName;

@Id
@GeneratedValue
public final long getId(){
    return id;
}

public void setId(long id){
    this.id = id;
}

public String getFirstName(){
    return firstName;
}

public void setFirstName(String firstName){
    this.firstName = firstName;
}
}

TestService.java(UserDao 实现 IUserDao 并扩展 GenericDao)

@Service(value = "testService")
@Transactional
public class TestService implements ITestService {
 @Autowired
private IUserDao userDao;

@Transactional(readOnly = false)
public void saveUser(User newUser){
    userDao.save(newUser);
}
.
.
.
}

persistence.xml

<persistence-unit name="gamelistPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        <!--
            value='create' to build a new database on each run;
            value='update' to modify an existing database;
            value='create-drop' means the same as 'create' but also drops tables when Hibernate closes;
            value='validate' makes no changes to the database
         -->
    </properties>

</persistence-unit>

我没有收到任何错误或异常或任何东西。我可以从我的数据库中读取。仅更新、添加或删除不持久。

这就是我尝试过的所有内容

  1. 一篇文章提到将 transaction-type="RESOURCE_LOCAL" 更改为 JTA,说 RESOURCE_LOCAL 根本不存在。我认为这是如果您在使用 RESOURCE_LOCAL 时仅使用休眠而不管理事务。我相信 spring 会为您管理交易。
  2. 有些人提到做 em.flush 或 em.getTransaction.begin 并在使用 persist 后提交。但是每次使用上述操作时都会出现此错误。 不允许在共享 EntityManager 上创建事务

感谢任何帮助。提前致谢

【问题讨论】:

  • 你能发布你的 UserDao 课程吗?
  • 在使用transaction-type="RESOURCE_LOCAL时尝试使用@PersistenceUnit,如here 所述
  • 调用这一切而不是持久化的代码是什么?

标签: java spring hibernate jpa entitymanager


【解决方案1】:

提交 TX(或刷新休眠)失败。您的声明性事务性不起作用,或者声明需要进一步扩展。

不应该将 DAO 声明为事务性的吗?这就是实际发生动作的地方,您在 TestService 的“事务”声明本身实际上并没有做任何事情——因此 Spring 可能会错过将 HB 加入事务。

我自己通常不使用声明性,因为我发现 TX 边界很容易且在用户活动中定义明确——并且在显式编码时更可跟踪/更可靠(1 行,通过我的帮助程序类)。

坦率地说,我也不知道你希望用你的 DAO 做什么——如果你使用 JPA/Hibernate,这些层会处理 DAO 会做什么。我怀疑你是在用什么都不做的类来搞砸你的应用程序,你不了解它们的正确用途/用途。

有什么问题:

Session hb = HbHelper.session();
hb.save( user);
HbHelper.commit();  // commits via a TX.

我将此样式与“OpenSessionInView”过滤器一起使用。

【讨论】:

  • 感谢您的回复。我实际上是在使用教程作为参考进行设置。据我了解,DAO 层基本上用于对特定对象(在本例中为用户)运行特定查询。实体管理器不和你在幕后做的一样吗?我也尝试使 DAO 具有事务性。但问题仍然存在。
  • 集成 Spring 和 Hibernate 的方法有多种。就个人而言,我将重要的业务逻辑单元放在用户服务和琐碎的东西中,比如调用entityManager.save(),我避免添加过多的层。我的方法是“在场景前”进行,就像以前一样。
  • 非常适合尝试使 DAO 事务化,可惜它不起作用。在 Google 中搜索“如何调试 Spring 声明式事务”,您会找到一些指南。据推测,由于某种原因,Hibernate 没有被征用......你需要自己调查一下,这超出了我的个人经验。
  • 好的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多