我正在使用JEE7创建一个Web应用程序。我的问题是关于我的应用程序的架构。基本上,我有几个实体类(业务类)代表将存储在我的数据库中的内容。例如,我有一个实体类Book和一个实体类Comic
要访问数据库,我想创建一个EJB(类似DAO设计模式的kindda)。这是我的问题,我无法在网上找到准确的答案。
我应该创建一个@remote接口和一个@stateless类,其中包含为Book类和漫画类添加/删除/获取/更新的所有方法吗?
或者我应该创建2个@remote接口和2个@stateless类(2个EJB),每个实体类一个?
因为我们想象一下我创建了一个更大的网络应如果我有100个实体类,第一个方法我将拥有一个巨大的EJB,但第二个方法我将拥有100个带有接口的EJB。我认为第二个更好,但我不确定。你觉得怎么样?
答案 0 :(得分:1)
为什么不使用一个无状态bean和一个远程接口?
远程bean的一个非常好的功能是,它们可以是通用的,所以基本上至少你只需要一个接口和一个远程bean(参见curl -v -F r={repo_id} -F hasPom=true -F e=jar -F file=@pom.xml -F file=@target/project.jar -F file=@target/project-sources.jar -u un:pwd {repo_url}
及其远程bean)。
我使用非常通用的远程bean DAO的混合来读取简单实体和一些特定bean,用于在CUD操作上需要更多逻辑的实体。我刚刚提取了最小的接口来重现它。
如果我创建一个新表和实体,它可以立即在远程客户端使用。
<强>实体强>
SimpleEntity
<强>接口强>
/*
* 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> { }
<强>客户端强>
在客户端使用JNDI,您可以使用JNDI服务定位器模式调用bean,如:
/*
* '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;
}
}
客户端JSF
使用通用JSF转换器和GUI框架的DAO的通用扩展(例如PrimeFaces EntityDAOBeanRemote<Foo> fooDAOBeanRemote = jndiServiceLocator
.getEntityDAOBeanRemote(Foo.class);
EntityDAOBeanRemote<Bar> barDAOBeanRemote = jndiServiceLocator
.getEntityDAOBeanRemote(Bar.class);
),可以节省大量时间,使新实体可以在JSF bean中快速访问,并可在GUI中进行编辑。
答案 1 :(得分:0)
Java EE应用程序体系结构显然是一个巨大的主题,但常见的方法是创建一个Session EJB来向客户端公开一般API调用,然后使用粗粒度Entity EJB来处理持久数据。这些实体EJB可以管理许多细粒度的Java对象和映射到数据库结构的类。
这可能是一个好的开始: https://docs.oracle.com/cd/A87860_01/doc/java.817/a83725/entity1.htm