如何使用 JPA/hibernate EntityManager 和 EJB3.0 实现泛型?

Posted

技术标签:

【中文标题】如何使用 JPA/hibernate EntityManager 和 EJB3.0 实现泛型?【英文标题】:How to implement generics using JPA/hibernate EntityManager and 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);

提前非常感谢。 干杯!

【问题讨论】:

【参考方案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)

以上是关于如何使用 JPA/hibernate EntityManager 和 EJB3.0 实现泛型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring JPA / Hibernate 进行条件插入

JPA Hibernate 使用UUID做为主键的问题

JPA Hibernate,如何在创建时进行验证,而在更新时忽略验证

Spring Boot:如何从 JPA/Hibernate 注释中保持 DDD 实体的清洁?

JPA/Hibernate 无法创建名为 Order 的实体

Java Spring JPA Hibernate没有更新列