JavaEE应用程序结构

时间:2016-10-27 14:18:50

标签: jpa java-ee dao java-ee-7

我正在使用JEE7创建一个Web应用程序。我的问题是关于我的应用程序的架构。基本上,我有几个实体类(业务类)代表将存储在我的数据库中的内容。例如,我有一个实体类Book和一个实体类Comic 要访问数据库,我想创建一个EJB(类似DAO设计模式的kindda)。这是我的问题,我无法在网上找到准确的答案。

我应该创建一个@remote接口和一个@stateless类,其中包含为Book类和漫画类添加/删除/获取/更新的所有方法吗?

或者我应该创建2个@remote接口和2个@stateless类(2个EJB),每个实体类一个?

因为我们想象一下我创建了一个更大的网络应如果我有100个实体类,第一个方法我将拥有一个巨大的EJB,但第二个方法我将拥有100个带有接口的EJB。我认为第二个更好,但我不确定。你觉得怎么样?

2 个答案:

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