2011-02-01 43 views
3

我一直在尋找Spring Roo生成的代碼,並且我注意到它創建的persist()方法給出Propagation.REQUIRES_NEW。默認傳播不會足夠嗎?爲什麼Spring Roo會持續存在()Propogation.REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void Entity.persist() { 
    if (this.entityManager == null) this.entityManager = entityManager(); 
    this.entityManager.persist(this); 
} 

一些附加信息。下面是生成此代碼的roo日誌:

// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:02 
project --topLevelPackage org.sotest.sscce --projectName Test --java 6 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:01:04 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:06 
persistence setup --database GOOGLE_APP_ENGINE --provider DATANUCLEUS 
entity --class ~.entities.Entity 
exit 
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:02:55 

我正在使用GA提供程序的GAE數據庫。我只是創建了一個實體,除了發佈上面的roo命令外,我沒有觸及任何文件。當我打開Entity_Roo_Entity.aj時,我得到上面的代碼。

我會再次嘗試使用最新版本的Roo並驗證相同的輸出。我也會在Roo相關的論壇上發佈這個問題。

更新:相同的代碼與袋鼠1.1.1(最新版本)

回答

2

第二個答案產生(後加入額外的信息來質疑)

這可能是由於使用GAE的。 GAE數據存儲不使用傳統的事務語義。請參閱GAE的事務隔離here的說明。具體做法是:

交易 內查詢和獲取,保證看到數據存儲 單, 一致的快照的開始 交易。 ...這個一致的 快照視圖在事務寫入後也延伸至讀取 。 與大多數數據庫不同,查詢 並進入數據存儲區 事務看不到 以前寫在該 事務中的結果。具體來說,如果 實體被修改或刪除 交易,查詢內或獲得收益 實體的原始版本作爲交易, 或沒有開始時的 如果實體不存在 然後。

也有restrictions on querying within a transaction。考慮到這一點,可能會添加REQUIRES_NEW,以便在「第一個」事務內的任何後續讀取按預期工作。看起來令人困惑和不規範,但也許這是在GAE的約束下工作時最好的選擇。

先回答

必須有一個誤解或 玩別的東西。我剛剛使用Roo v1.1.1 進行了檢查,生成一個簡單的實體,使用 休眠提供程序,並使用默認的 事務傳播。這 也有所驗證在 documentation

所有的持久性方法與Spring的事務支持 (Propagation.REQUIRED, Isolation.DEFAULT)配置 。

使用Propagation.REQUIRES_NEW將 不是默認的意義依然存在 方法。

我不是Roo的專家,所以不能 甚至想不到 這個。也許你應該發佈更多的 你的代碼,特別是任何 非標準配置。隨機 問題/想法:

  1. 您是使用Hibernate provider還是?
  2. Persisence-unit的任何自定義配置?
  3. 請確認您的實體持續存在方法的所有 Propagation.REQUIRES_NEW?
  4. 你在哪裏看到傳播註釋。 (例如在 * _Entity.aj文件?)
  5. 是否有任何機會,你的實體類(或它的父母之一) 有它自己的.persist方法(因此 壓倒一切的Roo的生成方法)。

    1http://static.springsource.org/spring-roo/reference/html/base-persistence.html

1:啊。我認爲這很可能是由於使用GAE/DN提供商。我會相應地修改我的答案。同時,請查看GAE的事務隔離附註:http://code.google.com/appengine/docs/java/datastore/transactions.html

+0

增加了一些解釋來解決您的問題。可能與GAE/DN有關,或者可能是Roo錯誤。我只想知道REQUIRES_NEW是否有充分的理由,因爲它會影響我的其他一些非roo項目。 – Pace 2011-02-04 17:06:53