@mrkovalchuk
Junior developer

Как настроить many-to-one зависимость (hibernate, spring, jfs)?

Доброго времени суток. Подскажите, как верно настроить many-to-one соединение, используя hibernate?

Ссылка на репозиторий: Notebook

Вводная: у нас имеется приложение "Записная книжка". БД устроена таким образом, что все записи хранятся в главной таблице Note в виде id их компонентов: человек, телефон, описание, группа. Со всеми прочими таблицами установлена связь One-to-one и всё хорошо работает.

Но с группой связь many-to-one и тут начинаются проблемы. Проблема в чем: я не знаю, как это исполнить на стороне пользователя (JSF-page).

В файле Test.xhtml (чуть ниже) я вызываю метод, который вытягивает из таблицы Group все записи, но есть одно "но", мне нужно, чтобы они: 1. Отображались на стороне клиента не как объекты, а как названия групп; 2. Чтобы при нажатии Save (смотри Test.xhtml) в метод передавался либо только Id, либо полный объект.

Body Test.xhtml

<body>
<f:view>
    <h:messages errorStyle="color: red" infoStyle="color: green" layout="table"/>
    <h1>Create Note</h1>
    <h:form>
        <h:panelGrid columns="2">

            <h:outputText value="Фамилия:"/>
            <h:inputText value="#{human.family}"/>
            <h:outputText value="Имя:"/>
            <h:inputText value="#{human.name}"/>
            <h:outputText value="Отчество:"/>
            <h:inputText value="#{human.secondName}"/>
            <h:outputText value="Дата:"/>
            <h:inputText value="#{human.birthday}">
                <f:convertDateTime type="date" pattern="dd-MM-yyyy"/>
            </h:inputText>
            <h:outputText value="Телефон:"/>
            <h:inputText value="#{telephone.telephone}"/>
            <h:outputText value="Группа:"/>
            <!--<ui:repeat value="${groupDAOImpl.group}" var="h">
                <h:selectOneMenu value="#{group.group}"  title="group">
                    <f:selectItems  value="${h.group}" var="h"/>
                </h:selectOneMenu>
            </ui:repeat>-->
            <h:outputText value="Описание:"/>
            <h:inputText value="#{description.text}"/>

        </h:panelGrid>

        <h:commandButton action="#{notebookFacade.createNote(human,telephone,description)}" value="Save" />
        <h:commandButton action="descriptionList" value="Cancel"/>
        <br/>
    </h:form>
</f:view>
</body>


Закомментированный блок - наша цель. Что должно получиться в итоге: в базу Note (главная база) должна занестись запись с id-шником выбранной пользователем группы (сейчас заносится, но без группы).

Mapping
<hibernate-mapping>

    <class name="Notebook.Enities.Note" table="note" schema="notebase">
        <id name="id" type="java.lang.Integer">
            <column name="Id" not-null="true"/>
            <generator class="identity"/>
        </id>
        <one-to-one class="Notebook.Enities.Telephone" name="telephoneId"  cascade="save-update"/>
        <one-to-one class="Notebook.Enities.Human" name="humanId" cascade="save-update"/>
        <!--<many-to-one class="Notebook.Enities.Group" name="group" column="Group" cascade="all" not-null="true"/>-->
    </class>
</hibernate-mapping>


Наша цель - закомментированная строка.

GroupDAOImpl.java
@Component
public class GroupDAOImpl implements groupDAO {
    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    @Override
    public List<Group> getGroup(){
        return sessionFactory.getCurrentSession().createCriteria(Group.class).list();
    }
}


Если для решения нужны еще какие-либо материалы, пишите в комментариях.
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
badprogrammist
@badprogrammist
Senior java developer
Подозреваю, что вам нужно описать конвертер, чтобы jsf смог из id вытащить нужный объект Group. <ui:repeat value="${groupDAOImpl.group}" var="h"> в заккоментированном кусочке не нужен, достаточно
<h:selectOneMenu value="#{group.group}"  title="group">
    <f:selectItems  value="${h.group}" var="h"/>
</h:selectOneMenu>
плюс описание конвертера
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы