2013-08-02 28 views
0

我無法使用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. 一個帖子中提到的改變交易型=「RESOURCE_LOCAL」到JTA說RESOURCE_LOCAL不持續的。我認爲這是因爲如果您僅使用hibernate而不使用RESOURCE_LOCAL管理事務。我相信春天會爲你管理交易。
  2. 一些提到做em.flush或em.getTransaction.begin並在使用persist後提交。但每次使用上述操作時都會出現此錯誤。 不允許在共享EntityManager上創建交易

任何幫助表示讚賞。在此先感謝

+0

你可以發佈你的UserDao類嗎? – Rafa

+0

當使用'transaction-type =「RESOURCE_LOCAL' –

+0

時,嘗試使用'@ PersistenceUnit'作爲[這裏](http://tomee.apache.org/jpa-concepts.html)中提及的內容。什麼是調用所有這些而不是持續? –

回答

0

這是一個失敗提交TX(或刷新休眠)。您的聲明性事務不起作用,或者聲明需要進一步擴展。

不應該將DAO聲明爲tranasactional?這就是動作實際發生的地方,TestService中的「事務性」聲明實際上並沒有做任何事情 - 所以Spring可能會錯過招募HB進入事務。

我一般不會使用聲明式的,我自己,因爲我發現TX邊界很容易&在用戶活動上有良好的定義 - 當顯式編碼(1行,通過我的助手類)時,可追蹤/可靠性更高。

坦率地說,我不知道你期望對你的DAO做什麼 - 如果你使用JPA/Hibernate,這些層處理DAO會做什麼。我懷疑你正在用無所事事的課程來攻擊你的應用程序,這是你無法理解的恰當目的/用途。

出了什麼問題:

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

我用這種風格與 「OpenSessionInView」 過濾器。

+0

感謝您的答覆,我實際上是使用一個教程作爲參考設置。從我的理解DAO層基本上用於運行特定對象(在這種情況下,用戶)的具體查詢,而不是entitymanager做和你在後臺做的一樣?我也試着做DAO事務處理,但問題仍然存在 –

+0

有幾種方法可以集成Spring和Hibernate,我個人把重要的業務邏輯單元放在用戶服務和微不足道的東西,就像調用'entityManager.save()'一樣,我避免添加多餘的圖層。我的方法就是在「場景前」這樣做。 –

+0

適合嘗試製作DA O交易,可惜它沒有奏效。搜索谷歌「如何調試春季聲明式交易」,你會發現一些指南。大概Hibernate沒有入伍,出於某種原因..你需要調查自己,這超出了我的個人經驗。 –