2013-08-29 55 views
1

我使用Spring Roo的生成一堆的Hibernate對象,裏面在同一個項目我的單元測試,如果我這樣做,我可以成功讀取,寫入數據庫:在非Maven-Non-Spring項目中包含Maven-Spring-Roo-Hibernate jar的正確過程是什麼?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext.xml"}) 
public class SomeTest extends AbstractJUnit4SpringContextTests { 

@Test 
public void someTest() throws Exception { 
    MyUser myUser = MyUsers.findByUserId(123); 
    System.out.println(myUser.getFirstName()); 
} 
.... 

現在,如果我做一個MVN清理安裝包,包括一個外部項目的罐子,做同樣的代碼:「(?是春節因素JAR配置爲AJC/AJDT方面庫)實體管理器尚未被注入」

MyUser myUser = MyUsers.findByUserId(123); 
System.out.println(myUser.getFirstName()); 

我得到

我試過創建ac拉斯春節-Roo的-Hibernate項目像這裏面並在此基礎之上加入ContextConfiguration:

@Service 
@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext.xml"}) 
public class SomeClassImpl { 

    public MyUser doSomething(){ 

     MyUser myUser = MyUsers.findByUserId(123); 
       return myUser; 

    } 

} 

現在,當我在一個外部項目調用DoSomething的():

public class TestDatabase { 
    public static void main(String[] args){ 

     SomeClassImpl k = new SomeClassImpl(); 
     k.doSomething(); 
    } 
} 

...我得到同樣的錯誤: 「實體管理器尚未被注入(是春節因素JAR配置爲AJC/AJDT方面的圖書館嗎?)」

在生成的AspectJ代碼展望:

privileged aspect MyUser_Roo_Jpa_ActiveRecord { 

    @PersistenceContext 
    transient EntityManager MyUser.entityManager; 

    public static final EntityManager MyUser.entityManager() { 
     EntityManager em = new MyUser().entityManager; 
     if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)"); 
     return em; 
    } 

...我可以看到,@PersistenceContext假設初始化MyUser.entityManager(),當項目被震動幷包含在外部項目中時,它不是。如何去手動初始化entityManager?還是有另一種方式來初始化在春季項目中的上下文時,它將它作爲一個包含的庫來初始化entityManager?

回答

1

因爲應用程序上下文不知道模型。您正在從appcontext創建模型。如果你使用getBean(「MyUser」)獲得模型;有些事情會起作用。否則自動連接模型並將該模型用於您的粗糙操作。

您可以在MyUser中看到以下代碼 - @PersistenceContext rotected transient EntityManager entityManager;然後,只有entityManager對象將在Myuser內初始化。

@RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext.xml"}) 
    public class SomeTest extends AbstractJUnit4SpringContextTests { 

     @Autowired 
     MyUser myUser; // use this object for ur crud operations 

     @Test 
     public void someTest() throws Exception {     
      MyUser otherObject= myUser.findByUserId(123); 
      System.out.println(otherObject.getFirstName()); 
     } 
    } 
+0

如何創建該實體管理器? –

+0

更新了答案。請你現在試試吧 – Prabhakaran

+0

我認爲你誤解了這個問題,ProjectA是一個Maven-SpringRoo-Hibernate項目,單元測試在ProjectA中工作正常,ProjectB是一個非Maven,非Spring的非Hibernate項目。 ProjectA被編譯成一個JAR文件並作爲ProjectB中的一個依賴項包含在內,然後projectB使用這些Hibernate對象,但由於上下文不是通過projectB在projectA中初始化的,所以失敗了。我想知道的是如何在projectB中包含projectA.jar並且仍然能夠在projectB中使用projectA中的Hibernate對象。 –

相關問題