我可以在EJB 3.2中获得类似于实体bean的东西吗?
我最近在读一本Java EE书,显然最近从EJB规范中删除了实体bean。 你应该使用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();
}
}
如果我理解正确,可以先创建一个实体:
@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;
}
现在你可以定义任何适用于你的实体类的方法。 请记住,如果您通过远程接口公开您的实体,它将处于分离状态。 所以在更新之后,你首先需要使用EntityManager
的merge(object)
方法
编辑
抽象门面是一个与JPA实体一起使用的概念,NetBeans 7.3版会自动为您生成它。 它用于定义实体上最常见的操作,因此您不必为每个实体重复代码。 它是这样的
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;
}
}
链接地址: http://www.djcxy.com/p/61421.html