EJB3开发中遇到的3个问题

09-07-14 tangshd
三个问题需要向大家请教,

1. TransactionManagement(TransactionManagementType.BEAN)可以被继承吗?

我把事物的界定放在了DDD中提到的APPLICATION层,也就是JDON中的SERVICE中。我定义了一个

@TransactionManagement(TransactionManagementType.BEAN)

public abstract class ApplicationBase {

@Resource

protected UserTransaction ut;

}

然后其他的APPLICATION层中的SESSION FACADE BEAN都继承自这个类,那这样 @TransactionManagement(TransactionManagementType.BEAN) 可以被继承吗? 我查了资料, 都没有找到。。

2. 就是在DAO层, 我想分别用SQL, JPA实现持久,分别用在不同的地方,比如做报表的时候,还是直接用SQL实现的比较好,其他的业务逻辑还是用JPA实现比较方便,这样就出现了一个问题

public class CustomerDaoMysql implements CustomerDao 这个SQL实现类可以正常运行

public class CustomerDaoJpa implements CustomerDao 这个实现类,因为用到了

@PersistenceContext

private EntityManager em; 必须是在EJB容器环境中。。那这样我就必须把CustomerDaoJpa 定义为一个SESSION BEAN吗?如果我必须把CustomerDaoJpa 定义为一个SESSION BEAN, 那注入的时候就必须要用@EJB了? 这个时候的注入就有了一些问题, SQL实现类的注入是通过IOC框架, JPA实现类的注入只能通过@EJB, 是不是可以用个桥接之类或者工厂转换一下, 我现在还没有确定,希望各位大侠给个意见。。

3. 还有就是我现在有一个问题,也许是我的基本功不够扎实,有个疑惑, 我是在APPLICATION层定义了SESSION BEAN, 并调用了DDD中的仓储 SERVICE MODEL 等, 这个统称DOMAIN吧, 现在单机测试来说没有问题, 如果以后分布部署EJB了, 那放在DOMAIN中的不是EJB的POJO会出现问题吗? 按道理来说,应该不会的,可是我不敢确定

[该贴被tangshd于2009-07-14 08:44修改过]

              

1
banq
2009-07-14 08:52
第一个问题实际是Annotation是否会被继承的问题,这个JEE5标准没有规定,那么各个服务器实现可能不一样,不过,既然用了Annotation这个类似BIND技术的注释,那么还是单个绑定比较好,否则代码就很难读懂。

第二个问题,JPA最好在EJB容器中调用,直接Session Bean调用EnntityManager就可以了,中间不要加DAO类或Repository类,你说的这个矛盾实际体现了EJB的不灵活性和透明性。EJB对代码有一套调用规则;DDD设计对代码有一套调用规则,两者发生矛盾时,到底听谁的?

第三个问题,DDD考虑到了分布式部署的设计,主要是划分边界和确定一致性的问题,如果你设计好,应该没有这个问题,当然Domain Model和JPA的实体Bean也会有一些冲突,在于你来协调。

xmuzyu
2009-07-14 09:15
pojos in action这本书上面有一章是讲解如何讲spring ioc和ejb 的jndi lookup ioc结合起来的。

对于第三个问题,一般在应用EJB的时候,都会用session facade外观,你在一个结点部署的时候,通过session Facade的ejb object来调用domain model,此时是不会出现问题。

猜你喜欢