2014-10-06 88 views
2

我想實現一個反模式,因爲@EntityListener s爲在某些情況下不足:JPA entity.save(EntityManager的)反模式

@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; 
    } 

    ... 
} 

PRO:

  • 具體的業務邏輯(REAL OO編程)
  • 利用繼承來控制業務邏輯(另一種OO模式)
  • 可以編寫通用的EJB

CON:

  • 沒有呼籲級聯
  • 合同除了:禁止撥打em.persist(entity)/em.merge(entity)

是否有別的東西,我忘了?

+1

是不是隻是'ActiveRecord'模式擴展到包括聽衆('@ PreInsert'等..)的東西? – 2014-10-07 08:39:31

+0

不知道這件事。是的,這是:) – 2014-10-10 06:25:33

回答

2

CON:

  • DAO的邏輯實體你打開了潘多拉盒子。如果實體中允許持久性邏輯,那麼爲什麼不使用表示邏輯呢?等等。那麼,爲什麼不是find...-方法呢?
  • 繞過層隔離。如果持久性邏輯集中在DAO中,則更容易控制,正在做什麼。
  • 將打破業務組件隔離。 (我甚至沒有在我的項目中公開業務組件之間的DAO,只有業務服務 - 更高一層。)
  • 將實體中的焦點從業務對象建模轉移到「我們只是在這裏處理一些數據」。我懷疑業務對象的目的,比如Contract就是堅持使用某種技術。
+0

DAO和商業服務有什麼區別? – 2014-10-10 06:56:53

+0

這是一個不同的問題。 :)請另外提問。 – lexicore 2014-10-10 07:13:10