2016-10-27 13 views
0

JEE7を使用してウェブアプリを作成しています。私の質問は私のアプリケーションのアーキテクチャです。基本的には、データベースに格納される内容を表す複数のエンティティクラス(ビジネスクラス)があります。例えば、私はエンティティクラスBookとエンティティクラスComicを持っています。
データベースにアクセスするには、EJB(DAOデザインパターンのようなkindda)を作成します。そして、ここに私の問題がある、私は正確な答えをオンラインで見つけることができませんでした。

BookクラスとComicクラスの両方を追加/削除/取得/更新するすべてのメソッドを持つ@remoteインターフェイスと@statelessクラスを1つ作成する必要がありますか?

または、2つの@remoteインターフェイスと2つの@statelessクラス(2つのEJB)を各エンティティクラスに1つずつ作成する必要がありますか?

私はもっと大きなWebアプリケーションを作成することができます。私が100のエンティティクラスを持っている場合、最初のメソッドでは1つの巨大なEJBを持っていますが、2番目のメソッドでは100のEJBを持つでしょう。私は二番目が良いと思うが、私は確信していない。どう思いますか ?JavaEEアプリの構造

+0

* JEE *は存在しません!代わりに* Java EE *を使用してください。 http://stackoverflow.com/q/36702229/1426227 –

答えて

0

Java EEアプリケーションのアーキテクチャは明らかに大きな話題ですが、一般的なアプローチはセッションAPIを作成してクライアントに一般的なAPIコールを公開し、粗粒度のEntity EJBを使用して永続データを処理する方法です。これらのEntity EJBは、データベース構造にマッピングされる、より細かく分類された多くのJavaオブジェクトおよびクラスを管理できます。

これは、開始するには良い場所かもしれません: https://docs.oracle.com/cd/A87860_01/doc/java.817/a83725/entity1.htm

+0

私はあなたの答えまたはそれがなぜ受け入れられるのか分かりません。エンティティBean(「Entity EJB」が意味するもの)とOracle 8iは15年の技術です –

1

理由だけではなく、ステートレスBeanとリモートインタフェースを使用していませんか?

リモートBeanの非常に優れた機能は、一般的なものであるため、基本的に最小限のインターフェイスとリモートBeanが1つだけ必要です(SimpleEntityおよびリモートBeanを参照)。

私はCUD操作でより多くのロジックを必要とするエンティティに対して単純なエンティティといくつかの特定のビーンを読み込むために、非常に汎用的なリモートBean DAOを組み合わせて使用​​します。私はちょうどそれを再現するために最小限のインタフェースを抽出した。

新しいテーブルとエンティティを作成すると、リモートクライアントですぐに使用できます。

エンティティ

/* 
* Complex entity with enhanced CRUD logic 
*/ 
public class Foo implements Entity { } 

/* 
* Simple entity without complex CRUD logic 
*/ 
public class Bar implements SimpleEntity { } 

インタフェース

public interface Entity { } 
public interface SimpleEntity extends Entity { } 

/* 
* Generic entity DAO interface, for remote beans and other datasources 
*/ 
public interface IEntityDAO<T extends Entity> 
{ 
    public T get(Class<T> type, long id); 
    public T update(T t); 
} 

/* 
* Generic remote bean interface for a JNDI service locator lookup 
*/ 
public interface EntityDAOBeanRemote<T extends Entity> extends IEntityDAO<T> { } 

ステートレス遠隔豆

/* 
* 'abstract' base class for stateless DAO beans 
*/ 
public class AEntityDAOBean<T extends Entity> implements EntityDAOBeanRemote<T> 
{ 
    public T get(Class<T> type, long id) 
    { 
     Session session = // obtain current hibernate session 
     return id == (T) session.createCriteria(type).add(Restrictions.idEq(id)).uniqueResult(); 
    } 

    public T update(T t, long id) 
    { 
     Session session = // obtain current hibernate session 
     session.update(t); 
     return t; // return updated instance 
    } 
} 

/* 
* Generic stateless remote DAO bean implementation 
*/ 
@Stateless(mappedName = "SimpleEntityDAOBean") 
@Remote(EntityDAOBeanRemote.class) 
public class SimpleEntityDAOBean extends AEntityDAOBean<SimpleEntity> implements EntityDAOBeanRemote<SimpleEntity> 
{ 
    // empty since all methods are from parent class 
} 

/* 
* Foo specific remote DAO bean 
*/ 
@Stateless(mappedName = "FooDAOBean") 
@Remote(EntityDAOBeanRemote.class) 
public class FooDAOBean extends AEntityDAOBean<SimpleEntity> implements EntityDAOBeanRemote<Foo> 
{ 
    @Override 
    public Foo update(Foo foo) 
    { 
     // make specific foo things and update 
     return foo; 
    } 
} 

クライアントあなたのようなJNDIサービスロケータパターンを使用してBeanを呼び出すことができ、あなたのクライアントでJNDIを使用して

EntityDAOBeanRemote<Foo> fooDAOBeanRemote = jndiServiceLocator 
     .getEntityDAOBeanRemote(Foo.class); 

    EntityDAOBeanRemote<Bar> barDAOBeanRemote = jndiServiceLocator 
     .getEntityDAOBeanRemote(Bar.class); 

クライアントJSF

一般的なJSFコンバータとの一般的な拡張子を持ちますDAOをGUIフレームワーク(PrimeFaces LazyDataModelなど)に使用すると、新しいエンティティをJSF Beanにすばやくアクセスしたり、GUIで編集したりできるようになります。

関連する問題