簡體   English   中英

JSF支持bean和Hibernate映射

[英]JSF backing bean and Hibernate mapping

我認為我遇到了一個非常直接的問題,但是我無法為Hibernate的類提出一個很好的結構,也找不到最佳實踐的例子。

我有一個帶有映射類Test的表測試。 在由Bean控制的一個頁面上,我將所有項目都列在列表中以進行管理編輯(AdminTest),在另一頁面中,列出了相同的項目,但對於普通用戶而言,具有諸如單選按鈕之類的東西可以影響它們(ShowTest)而無需更改數據庫。

由於Hibernate似乎堅持要在使用addEntity-function檢索項目時指定直接映射的類(在以Manager結尾的類中),因此感覺像是我被迫做這樣的事情:

class Test { ... }

class AdminTest extends Test { ... }

@ManagedBean
class AdminTestManager {

    List<AdminTest> items;

}

class ShowTest extends Test { ... }

@ManagedBean
class ShowTestManager {

    List<ShowTest> items;

}

然后將AdminTest和ShowTest分別映射到具有相同字段的同一表。 這真的很糟糕,因為每當我向表測試添加字段時都需要更新兩個映射。

感覺就像我在這里錯過了什么,您實際上應該只需要將一個Test映射到表test,然后進行一些漂亮的繼承映射,但是那些需要一些標識符,例如列或一對一的映射表。

編輯:

我嘗試過的另一種解決方案是為Test建立一個映射,仍然讓AdminTest和ShowTest擴展該類,但是我將帶有反射的吸氣劑復制到擴展類中。

編輯2:

我將在此處提供一個“現實世界”場景,以更好地解釋我的要求。 可以說,我想用一個頁面來制作一個測驗引擎,您可以在其中通過輸入字段填寫問題,而另一頁面用單選按鈕按每個項目的“是”或“否”列出這些問題。

就像這樣創建數據庫表:

CREATE TABLE question (id INT AUTO_iNCREMENT, text VARCHAR, correct_answer INT, primary key(id));

我認為我需要的類是:

class Question {

    private int id;
    private String text;
    private int correctAnswer;

    // Getters and setters.

}

class EditQuestion extends Question {

    void updateItem() { ... }
    void removeItem() { ... }

}

@ManagedBean(name = "edit_quiz")
@ViewScoped
class EditQuestionManager {

        List<EditQuestion> items;
        void addItem() { ... }
        void init() {

            items = (ArrayList<EditQuestion>) HibernateUtil.getSessionFactory().getCurrentSession().createSQLQuery("SELECT * FROM question").addEntity(EditQuestion.class)
    .list();

        }
}

class AnswerQuestion extends Question {

    int radioButtonValue;

    // Getters and setters.

}

@ManagedBean(name = "take_quiz")
@ViewScoped
class AnswerQuestionManager {

        List<AnswerQuestion> items;
        void calculateResults() { ... }
        void init() {

            items = (ArrayList<AnswerQuestion>) HibernateUtil.getSessionFactory().getCurrentSession().createSQLQuery("SELECT * FROM question").addEntity(AnswerQuestion.class).list();

        }
}

然后,例如,顯示測驗的JSF頁面可能是這樣的:

<ui:repeat value="#{take_quiz.items}" var="question">
    <div>#{question.text}</div>
    <h:selectOneRadio value="#{question.radioButtonValue}" onchange="submit()">
        <f:selectItem itemValue="1" itemLabel="Yes" />
        <f:selectItem itemValue="0" itemLabel="No" />
    </h:selectOneRadio>
</ui:repeat>
<h:commandLink action="#{take_quiz.calculateResults()}">Done</h:commandLink>

現在的問題,至少對我來說是這樣的,要為admin-view和user-view都創建這樣的列表,我需要輸入條目以將表“ question”映射到AnswerQuest和EditQuestion中。 hbm.xml文件。 至少不用反射(將所有問題的getter值復制到Question到新的AnswerQuestion / EditQuestion實例中)對我來說是一種hack嗎? 我的意思是這似乎不太復雜?

解決方案:除了具有類的擴展映射Hibernate的表類的我只是增加他們的類型的私有財產。 另外,在管理類我遍歷從數據庫中的項目后,他們已經進行檢索和設置像這樣的列表:

ArrayList<Question> tempItems = (ArrayList<Question>)  HibernateUtil.getSessionFactory().getCurrentSession().createSQLQuery("SELECT * FROM question").addEntity(Question.class).list();
ArrayList<EditQuestion> items = ArrayList<EditQuestion>();
for(int i = 0; tempItems.size(); i++) {
    EditQuestion item = new EditQuestion();
    item.setQuestion(tempItems.get(i));
    items.add(item);
}

我正在努力理解您的問題。 您是否無法表達類繼承的實體?

您是否考慮過在Test類的頂部使用import javax.persistence.Inheritance批注?

例:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Test {
}

@Entity
public class AdminTest extends Test {
}

這里更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM