【问题标题】:JPA entity.save(EntityManager) anti-patternJPA entity.save(EntityManager) 反模式
【发布时间】:2014-10-06 07:26:34
【问题描述】:

我正在考虑实现一个反模式,因为 @EntityListeners 在某些情况下是不够的:

@MappedSuperclass
public abstract class AbstractEntity implements Serializable
{
    ...

    public abstract AbstractEntity save(EntityManager em);

    ...
}

@Entity
public class ConcreteEntity extends AbstractEntity
{
    ...

    public ConcreteEntity save(EntityManager em)
    {
        doSomeStuff(this);

        ConcreteEntity merged;
        if(id == null)
        {
            em.persist(this);
            merged = this;
        }
        else
        {
            merged = em.merge(this);
        }

        doOtherStuff(merged);

        return merged;
    }

    ...
}

专业版:

  • 具体业务逻辑在 Object 内部(REAL OO 编程)
  • 利用继承来控制业务逻辑(另一种 OO 模式)
  • 可以编写通用 EJB

缺点:

  • 级联不调用
  • 合约添加:禁止调用em.persist(entity)/em.merge(entity)

还有什么我忘记了吗?

【问题讨论】:

  • 不只是ActiveRecord 模式扩展为包括监听器(@PreInsert 等)的东西吗?
  • 不知道这个。是的,它是:)

标签: jpa anti-patterns


【解决方案1】:

缺点:

  • 使用实体中的 DAO 逻辑,您将打开一个潘多拉魔盒。如果实体中允许使用持久性逻辑,那么为什么不使用表示逻辑呢?等等。那么,为什么不用find...-methods 呢?
  • 绕过层隔离。如果持久性逻辑集中在 DAO 中,则更容易控制正在做什么。
  • 将打破业务组件隔离。 (我什至不公开项目中业务组件之间的 DAO,只公开业务服务 - 更高一层。)
  • 将实体中的焦点从对业务对象建模转移到“我们在这里只处理一些数据”。我怀疑像 Contract 这样的业务对象的目的是使用某些技术来坚持自己。

【讨论】:

  • DAO和业务服务有什么区别?
  • 这是一个不同的问题。 :) 请单独询问。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2018-01-20
  • 2023-04-11
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多