0

我最近正在阅读一本 Java EE 书籍,显然实体 bean 最近已从 EJB 规范中删除。您应该改用 JPA。但我想要实体豆!!我真正在寻找的是一个可远程访问的 JPA 持久实体,例如 EJB。像这样的东西:

@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

编辑
抽象外观是一个与 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 操作。因此,扩展外观使您能够定义开箱即用的操作。当然,这只是为了基本配置,Entity 门面可以使用许多实体并在它持久化之前执行一些业务逻辑。所以在你的情况下,它会是这样的:

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 回答