0

私は最近 Java EE の本を読んでいましたが、最近エンティティ Bean が EJB 仕様から削除されたようです。代わりに JPA を使用することになっています。でもエンティティビーンズが欲しい!! 私が本当に探しているのは、EJB のように、リモートからアクセスできる JPA 永続エンティティです。このようなもの:

@Entity
@Remote(MyEntityRemote.class)
@LocalBean
public class MyEntityEJB implements MyEntityRemote {
    public void doSomething() {
        // actually do something
    }
}

Bean アノテーションを削除せずに、次のようなセッション Bean を作成しなくても、これは可能なのでしょうか。

@Stateless
@Remote(StatelessInterfaceToMyEntityRemote.class)
@LocalBean
public class StatelessInterfaceToMyEntity implements StatelessInterfaceToMyEntityRemote {
    public void doSomething(MyEntity entity) {
        entity.doSomething();
    }
}
4

1 に答える 1

3

私があなたを正しく理解していれば、最初にエンティティを作成することが可能です:

@Entity
@Table('MyEntityTable')
public class MyEntity {...}

次に、エンティティのセッション Bean ファサードを作成し、それを介して必要なインターフェースを公開します。

@Stateless //Facade is a seesion bean so it can be @Stateless or @Statefull for basic CRUD it shoud be @Stateless
public class EntityFacade extends AbstractFacade<MyEntity> {
@PersistenceContext(unitName = "MyPersistanceUnit") //remember to define it first
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}

これで、Entity クラスで動作する任意のメソッドを定義できます。リモート インターフェイスを介してエンティティを公開すると、エンティティは切り離された状態になることに注意してください。したがって、更新後、最初に次のmerge(object)メソッドを使用する必要がありますEntityManager

EDIT
抽象ファサードは JPA エンティティで使用される概念であり、バージョン 7.3 の NetBeans はそれを自動的に生成します。エンティティで最も一般的な操作を定義するために使用されるため、エンティティごとにコードを繰り返す必要はありません。こんなふうになります

public abstract class AbstractFacade<T> {
private Class<T> entityClass;

public AbstractFacade(Class<T> entityClass) {
    this.entityClass = entityClass;
}

protected abstract EntityManager getEntityManager();

public void create(T entity) {
    getEntityManager().persist(entity);
}

public void edit(T entity) {
    getEntityManager().merge(entity);
}

public void remove(T entity) {
    getEntityManager().remove(getEntityManager().merge(entity));
}

public T find(Object id) {

    return getEntityManager().find(entityClass, id);
}
...
}

上記の関数は、ほとんど労力をかけずにいくつかの基本的な CRUD 操作を実行します。そのため、ファサードを拡張すると、すぐに使える操作を定義することができます。もちろん、これは基本的な構成のためだけに、エンティティ ファサードは多くのエンティティを使用し、何かを永続化する前にいくつかのビジネス ロジックを実行できます。したがって、あなたの場合は次のようになります。

public class EntityFacade extends AbstractFacade<MyEntity> {
@PersistenceContext(unitName = "MyPersistanceUnit") //remember to define it first
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
 public doSomething(MyEntity entity)
{
 entity.get(...);
  ...
 entity.set(...)
  if(iWantToPesristIt)
    edit(entity)
  else
    return;
}
}
于 2013-09-12T11:14:40.213 に答える