2013-06-19 19 views
1

我在2個對象之間有一個雙向關係-EvalMasterEvaluation(one)和EvalMasterEvalDetail(many)。我嘗試了許多不同的解決方案,但是我必須錯誤地實現它們。我的目標是返回給定eval id的詳細信息列表。使用Jackson 2.2將Hibernate結果序列化爲JSON字符串,無限循環

我使用傑克遜2.2(與數據綁定和數據類型 - hibernate3庫),休眠3.6和春天3.2.1。爲了便於閱讀,省略了一些代碼。

的父類:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class EvalMasterEvaluation implements java.io.Serializable { 

    private BigDecimal id; 
    @JsonManagedReference private Set<EvalMasterEvalDetail> evalMasterEvalDetails = new HashSet<EvalMasterEvalDetail>(
      0); 
} 

的子類:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class EvalMasterEvalDetail implements java.io.Serializable { 
    private BigDecimal id; 
    @JsonBackReference private EvalMasterEvaluation evalMasterEvaluation; 
    private String active; 
} 

我的Hibernate條件查詢:

Criteria criteria = session.createCriteria(EvalMasterEvalDetail.class) 
        .add(Restrictions.eq("active", "Y")) 
        .setFetchMode("evalMasterEvaluation", FetchMode.JOIN) 
        .createAlias("evalMasterEvaluation", "eval") 
        .add(Restrictions.eq("eval.id", evalId)) 
        .addOrder(Order.asc("detailOrder")); 

      details = criteria.list(); 

      ObjectMapper mapper = new ObjectMapper(); 
      json = mapper.writeValueAsString(details); 

EvalMasterEvaluation映射

<hibernate-mapping> 
    <class name="org.anes.surveys.domain.EvalMasterEvaluation" table="EVAL_MASTER_EVALUATION"> 
     <id name="id" type="big_decimal"> 
      <column name="ID" precision="22" scale="0" /> 
      <generator class="sequence-identity" > 
       <param name="sequence">EVAL_MASTER_EVALUATION_SEQ</param> 
      </generator> 
     </id> 
     <set name="evalMasterEvalDetails" table="EVAL_MASTER_EVAL_DETAIL" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="MASTER_EVAL_ID" precision="22" scale="0" not-null="true" /> 
      </key> 
      <one-to-many class="org.anes.surveys.domain.EvalMasterEvalDetail" /> 
     </set> 
    </class> 
</hibernate-mapping> 

EvalMasterEvalDetail映射

<hibernate-mapping> 
    <class name="org.anes.surveys.domain.EvalMasterEvalDetail" table="EVAL_MASTER_EVAL_DETAIL"> 
     <id name="id" type="big_decimal"> 
      <column name="ID" precision="22" scale="0" /> 
      <generator class="sequence-identity" > 
       <param name="sequence">EVAL_MASTER_EVAL_DETAIL_SEQ</param> 
      </generator> 
     </id> 
     <many-to-one name="evalMasterEvaluation" class="org.anes.surveys.domain.EvalMasterEvaluation" fetch="select"> 
      <column name="MASTER_EVAL_ID" precision="22" scale="0" not-null="true" /> 
     </many-to-one> 
     <property name="active" type="string"> 
      <column name="ACTIVE" length="1" not-null="true" /> 
     </property> 
    </class> 
</hibernate-mapping> 

回答

0

AYE!兩天後,我終於找到了我的錯誤。我忘了註冊Hibernate3Module。我的標準/映射器代碼現在是:

Criteria criteria = session.createCriteria(EvalMasterEvalDetail.class) 
        .add(Restrictions.eq("active", "Y")) 
        .setFetchMode("evalMasterEvaluation", FetchMode.JOIN) 
        .createAlias("evalMasterEvaluation", "eval") 
        .add(Restrictions.eq("eval.id", evalId)) 
        .addOrder(Order.asc("detailOrder")); 

      details = criteria.list(); 

      ObjectMapper mapper = new ObjectMapper(); 
      mapper.registerModule(new Hibernate3Module()); 
      json = mapper.writeValueAsString(details); 

evalMaster評估值缺失,但它是朝正確方向邁出的一步。

+0

您是否也找到了解決方案的值? – Atais

+0

我已經報廢了這個查詢。我現在不記得我是否修復了這個問題,但是Hibernate 3 Module在我的應用程序中與其他hql查詢一起成功運行。 –

相關問題