【问题标题】:How to implement generics using JPA/hibernate EntityManager and EJB3.0?如何使用 JPA/hibernate EntityManager 和 EJB3.0 实现泛型?
【发布时间】:2010-10-15 12:20:24
【问题描述】:

我有一个 slsb 持有我的业务逻辑,我如何使用泛型将以下三种方法变为一个泛型方法?前两个是同一个数据库,第三个是不同的数据库。这些方法还需要与事务相关的进一步注释吗?

@PersistenceContext(unitName = "db")
private EntityManager myEntityManager;

@PersistenceContext(unitName = "db2")
private EntityManager myDB2EntityManager;

@TransactionAttribute(TransactionAttribute.Required)
public void crud(MyEntity myEntity) throws MyException {
 myEntityManager.merge(myEntity);
}

public void crud(ADifferentEntity aDifferentEntity) throws MyException {
 myEntityManager.merge(aDifferentEntity);
}

public void crud(DB2Entity db2Entity) throws MyException {
 myDB2EntityManager.merge(db2Entity);
}

提前非常感谢。 干杯!

【问题讨论】:

    标签: java generics jpa ejb-3.0 entitymanager


    【解决方案1】:

    不确定我是否完全理解这个问题,但是: 由于您在那里有两个不同的实体管理器和两个不同的数据库(假设您没有同时将相同的数据重复保存到两个数据库,看起来您不是),我认为有两种不同的方法是合理的在您的界面中。 (我会以不同的方式命名它们以避免混淆。)

    要合并前两个如何使用通用接口或继承的抽象基类并将参数类型更改为该通用类型?

    【讨论】:

      【解决方案2】:

      如果您需要在同一方法中合并来自 2 个不同数据库的 2 个实体,则应配置 JTA - 因为事务将跨越 2 个数据库。

      不太清楚你想用通用的东西做什么......你是否试图提供一种方法来粗暴,例如一个T extends AbstractEntity,然后在crud方法中,

      crud(T entity) {
          if (entity instanceof DB1Entity) then em1.merge(entity) 
            else em2.merge(entity)
      }
      

      ???

      或者您是否尝试进行水平分区?:

      Multi-user Datasources - Spring + Hibernate,

      http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring

      【讨论】:

      • 我认为无状态注释消除了对 ejb3.0 中每个方法的事务属性注释的需要?
      • 是的,在 EJB3 中,所有 EJB 方法默认都是事务性的(必需)。因此,任何 EJB 方法都不需要 @TransactionAttribute,除非您需要与方法的默认值不同的 tx 属性(例如 REQIURES_NEW)
      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2017-02-25
      • 2014-06-28
      • 2011-12-26
      • 2020-03-16
      • 2010-12-10
      • 2010-12-21
      相关资源
      最近更新 更多