2013-07-29 35 views
0

我使用OpenPojo自動對我的JPA實體測試。我遇到了與其他實體有關的實體的麻煩。Openpojo拋出BusinessException當一個POJO引用了另一個POJO

例子:

public class Person { 
    @BusinessKey 
    private Integer id; 

    ...getters/setters 

    @Override 
    public boolean equals(Object obj) { 
      return BusinessIdentity.areEqual(this, obj); 
    } 

    @Override 
    public int hashCode() { 
      return BusinessIdentity.getHashCode(this); 
    } 
} 


public class Employee { 
    @BusinessKey 
    private Integer id; 

    private Person person; 

    ...getters/setters 

    @Override 
    public boolean equals(Object obj) { 
      return BusinessIdentity.areEqual(this, obj); 
    } 

    @Override 
    public int hashCode() { 
      return BusinessIdentity.getHashCode(this); 
    } 
} 

這裏是我的測試案例:

// Create Rules to validate structure for POJO_PACKAGE 
    pojoValidator.addRule(new NoPublicFieldsRule()); 
    pojoValidator.addRule(new NoPrimitivesRule()); 
    pojoValidator.addRule(new NoStaticExceptFinalRule()); 
    pojoValidator.addRule(new GetterMustExistRule()); 
    pojoValidator.addRule(new SetterMustExistRule()); 
    pojoValidator.addRule(new NoNestedClassRule()); 

    // Create Testers to validate behaviour for POJO_PACKAGE 
    pojoValidator.addTester(new DefaultValuesNullTester()); 
    pojoValidator.addTester(new SetterTester()); 
    pojoValidator.addTester(new GetterTester()); 

    for (PojoClass pojoClass : pojoClasses) { 
     pojoValidator.runValidation(pojoClass); 
    } 

,我發現了以下異常:

com.openpojo.business.exception.BusinessException: Field required and can't be null [PojoFieldImpl 

如果我從刪除提及人員工對測試進行分類,不會引發任何異常。除非你使用註釋「@BusinessKey」,你是上市@BusinessIdentity

回答

2

OpenPojo不會拋出該異常。你還沒有展示你的equals和hashCode或toString實現,其中是否引用了「BusinessIdentity」?

另一件要注意,@BusinessKey應該用來註釋實際的業務領域不是你的DB代理ID(又名主鍵)。

+0

奧斯曼,@BusinessIdentity是一個錯字,我已經定格在我的問題。我還包括equals和hashCode方法。 –

+0

如果你註釋您的代理鍵(即主鍵),和POJO移交給你的框架,堅持,該框架將嘗試重複數據刪除的條目,它會通過調用hashCode()方法做到這一點,和equals(),這些調用將強制BusinessIdentity嘗試理解如何進行平等 - 這對於空對象是不可能的。最好是註釋一些在數據庫中不能爲空的東西,例如Person的名/姓,或者定義唯一性的其他東西。 –

+0

見:http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/persistent-classes.html#persistent-classes-equalshashcode和http://stackoverflow.com/a/2720173/634553 –