无法使用Spring + Hibernate保留数据

时间:2013-08-02 23:54:43

标签: java spring hibernate jpa entitymanager

我无法使用spring和hibernate来保存数据。我查看了各种帖子并尝试了很多东西。但它只是不起作用。 我会首先发布我的配置,然后是我尝试的步骤。非常感谢任何帮助。

弹簧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时只使用hibernate而不管理你的事务。我相信spring会为您管理交易。
  2. 有人提到在使用persist后执行em.flush或em.getTransaction.begin并提交。但是每次我使用上面提到的操作时都会出现此错误。 不允许在共享的EntityManager上创建事务
  3. 感谢任何帮助。提前致谢

1 个答案:

答案 0 :(得分:0)

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

不应该将DAO声明为tranaactional?这就是动作实际发生的地方,你在TestService上的“事务”声明实际上并没有做任何事情 - 所以Spring可能会错过将HB招募到事务中。

我一般不使用声明,我自己,因为我发现TX边界容易和在用户活动中定义明确 - 在显式编码时更加可追溯/可靠(1行,通过我的助手类)。

坦率地说,我不知道你对DAO的期望是什么 - 如果你正在使用JPA / Hibernate,这些层会处理DAO会做什么。我怀疑你是在用无用的课程来解决你的应用程序,这是你不理解的正确目的/用途。

出了什么问题:

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

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