2011-09-28 24 views
0

您能告訴我該怎麼做最好? 我如何在Web應用程序中創建一個實體的新實例,如果我只有接口..Java EE:EJB實體,Web Standalone

我:

  • EJB(3.1)項目
  • Web項目

我有一個EJB項目像:

User.java

@Entity 
public class User { 
    //variables.. getters and setters... 
} 

UserManagerBean.java

@Stateful 
public class UserManagerBean implements UserManager { 
    //getters and setters... 
    //....... 
    public void addUser(User user) { 
     //implemented here 
    } 
    //....... 
} 

UserManager.java

@Local 
@Remote 
public interface UserManager { 
    //methods here 
} 

在Web應用程序(一個獨立的Web應用程序),我有這樣的:

的UserManager .java

public interface UserManager { 
    //methods here 
} 

User.java

public interface User { 
    //methods here 
} 

現在..在豆......我試圖從遠程上下文來獲取我的豆子並使用它們:

//ctx is created with the specific properties to access remote context.. 
InitialContext ctx = new InitialContext(); 
userManager = (UserManager)ctx.lookup("java:global/project/projectEJB/UserManagerBean"); 

User user = userManager.getUserById(1); //working 

User new_user = (User)ctx.lookup("java:global/project/projectEJB/User"); //not working 
//I know this is not supposed to work.. but how can I do this? 

我知道你不能得到一個實體的實例,因爲它不是一個ejb ... 我是否必須創建一個像projectEJB一樣普通的用戶類?沒有更好的解決方案嗎? 還有哪些其他解決方案?我搜索谷歌和它似乎像大家都知道如何做到這一點。只有我不...

預先感謝您..

回答

1

要創建User對象,只需使用'new'操作符創建一個常規Java實例,然後調用EJB調用。

User myNewUser = new User(); 
userManager.addUser(myNewUser); 

無論是客戶端(Web應用程序)和服務器端(EJB 3.1項目)必須知道如何序列化和反序列化用戶對象,因此各方都必須能夠訪問用戶類和EJB接口。

就打包而言,您可以將EJB接口和用戶實體類都捆綁到一個由客戶端和服務器端使用的單個JAR中。

另一種部署是將Web應用程序和EJB綁定到部署在同一個JVM中的單個應用程序中。

1

實體Bean不應該是在網絡層中直接創建—,因爲爲了使它們保持不變,你需要EntityManager,它不能保證線程安全(這在servlet上下文中很重要)。

你可能想要做的是用一種方法編寫一個DAO EJB來創建一個新用戶,在servlet中注入/查找並調用它。 Google以「GenericDAO」模式開始。

+0

不是我的用戶管理器已經是DAO了嗎?你的建議是爲我的實體課創建一個dao-setters和getters--對嗎? – Alex

+1

@ user969812嗯,我無法知道UserManagerBean是否是DAO。如果它只對用戶實體起作用,那很可能是。當然,您可以創建一個具有「新」的實體,但堅持它應該發生在EJB一側。另一個提示:您可以將「addUser」的返回類型更改爲User,並返回您新保留的實體。 – MaDa