2013-01-04 24 views
2

我使用spring,使用hibernate和Mysql db。 我有Question對象,它具有Answer對象集合。使用休眠模式以隨機順序初始化集合對象

我question.hbm.xml是

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools 
--> 
<hibernate-mapping> 
    <class name="com.gamesapp.model.Question" table="question" > 
     <cache usage="read-write"/> 
     <id name="questionId" type="java.lang.Long"> 
      <column name="question_id" /> 
      <generator class="identity" /> 
     </id> 
     <property name="description" type="java.lang.String"> 
      <column name="description" length="500" not-null="true" /> 
     </property> 
     <property name="difficultyLevel" type="java.lang.String"> 
      <column name="difficulty_level" length="6" not-null="true" /> 
     </property> 
     <property name="isMixer" type="java.lang.String"> 
      <column name="is_mixer" length="5" not-null="true" /> 
     </property> 
     <property name="status" type="java.lang.String"> 
      <column name="status" length="7" not-null="true" /> 
     </property> 
     <set name="answers" inverse="true" > 
     <cache usage="read-write"/> 
      <key> 
       <column name="question_id" not-null="true" /> 
      </key> 
      <one-to-many class="com.gamesapp.model.Answer" /> 
     </set> 

     <set name="questionAnswerUsers" inverse="true" > 
     <cache usage="read-write"/> 
      <key> 
       <column name="question_id" not-null="true" /> 
      </key> 
      <one-to-many class="com.gamesapp.model.QuestionAnswerUser" /> 
     </set> 
    </class> 
</hibernate-mapping> 

我answer.hbm.xml是

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools 
--> 
<hibernate-mapping> 
    <class name="com.gamesapp.model.Answer" table="answer" > 
     <cache usage="read-write"/> 
     <id name="answerId" type="java.lang.Long"> 
      <column name="answer_id" /> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="question" class="com.gamesapp.model.Question" fetch="select"> 
      <column name="question_id" not-null="true" /> 
     </many-to-one> 
     <property name="description" type="java.lang.String"> 
      <column name="description" length="100" not-null="true" /> 
     </property> 
     <property name="dragPosition" type="java.lang.Short"> 
      <column name="drag_position" /> 
     </property> 
     <property name="orderSequence" type="java.lang.Integer"> 
      <column name="order_sequence" not-null="true" /> 
     </property> 
     <property name="isAnswer" type="java.lang.String"> 
      <column name="is_answer" length="5" not-null="true" /> 
     </property> 

     <property name="askPercentage" type="java.lang.Double"> 
      <column name="ask_percentage" not-null="true" /> 
     </property> 
     <set name="questionAnswerUsers" inverse="true"> 
      <cache usage="read-write"/> 
      <key> 
       <column name="answer_id" not-null="true" /> 
      </key> 
      <one-to-many class="com.gamesapp.model.QuestionAnswerUser" /> 
     </set> 
    </class> 
</hibernate-mapping> 

現在我的問題是,我想以隨機順序獲取問題的清單。 並且對於每個Question對象,我都希望使用Hibernate標準來渴望獲取答案集,並且答案集也應該隨機初始化。

例如說問題對象questionOne有一組回答有四個Answer object.say ans1,ans2,ans3和ans4。現在我第一次提取questionOne,答案集應該初始化爲答案= {ans1,ans2,ans3,ans4}第二次我提取question1一個對象,我應該得到答案設置爲answer = {ans4,ans2,ans3,ans1}。

問題列表應該隨機初始化。 永久問題的答案集應該使用休眠標準進行提取,每次物品都應該洗牌。

在此先感謝。

回答

2

只需使用Collections.shuffle()得到改組名單:

List<Question> questions = em.createQuery(...).getResultList(); 
Collections.shuffle(questions); 

而在實體問題:

public List<Answer> getShuffledAnswers() { 
    List<Answer> result = new ArrayList<Answer>(this.answers); 
    Collections.shuffle(result); 
    return result; 
} 
+0

感謝您的回覆JB Nizet。但問題是,我想初始化一組答案,而不是通過使用java隨機初始化Hibernate。如果我使用上述方法,我必須在Question類中定義另一個集合。 –

+0

這是標準。嘗試{ 的DetachedCriteria標準= DetachedCriteria.forClass(Question.class) .setFetchMode( 「回答」,FetchMode.JOIN)語句\t \t \t \t \t。新增(Restrictions.sqlRestriction(「1 = 1組由question_id爲了通過RAND() 「)) \t \t \t }趕上(RuntimeException的重新){ \t \t \t re.printStackTrace(); \t \t \t log.debug(re); \t \t \t return null; \t \t} –

+0

如果Set不適用於此方法,請爲列表建議我。謝謝 –