Arhn - архитектура программирования

как автоматически генерировать данные в таблицу базы данных, связанную с другой таблицей, используя JSF 2.2 и JPA

Я работаю над JSF 2.2 и JPA 2.1.

У меня есть две таблицы курса и единицы, эта таблица имеет отношение (каждый курс может иметь много единиц)

В таблице курса есть поле для установки количества единиц

Я хочу генерировать единицы автоматически, когда я создаю курс, используя количество единиц.

Я пытаюсь сделать это, но пока не получается

класс единицы измерения:

@Entity
@Table(catalog = "utechsacademy", schema = "", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"unit_id"})})
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Unit.findAll", query = "SELECT u FROM Unit u"),
    @NamedQuery(name = "Unit.findByCourse", query = "SELECT u FROM Unit u WHERE u.courseId = :courseId"),
    @NamedQuery(name = "Unit.findByUnitId", query = "SELECT u FROM Unit u WHERE u.unitId = :unitId"),
    @NamedQuery(name = "Unit.findByUnitNumber", query = "SELECT u FROM Unit u WHERE u.unitNumber = :unitNumber")})
public class Unit implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "unit_id", nullable = false)
    private Integer unitId;
    @Basic(optional = false)
    @NotNull
    @Column(name = "unit_number", nullable = false)
    private int unitNumber;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "unitId")
    private List<Lesson> lessonList;
    @JoinColumn(name = "course_id", referencedColumnName = "course_id", nullable = false)
    @ManyToOne(optional = false)
    private Course courseId;

    public Unit() {
    }

    public Unit(Integer unitId) {
        this.unitId = unitId;
    }

    public Unit(Integer unitId, int unitNumber) {
        this.unitId = unitId;
        this.unitNumber = unitNumber;
    }

    public Integer getUnitId() {
        return unitId;
    }

    public void setUnitId(Integer unitId) {
        this.unitId = unitId;
    }

    public int getUnitNumber() {
        return unitNumber;
    }

    public void setUnitNumber(int unitNumber) {
        this.unitNumber = unitNumber;
    }

    @XmlTransient
    public List<Lesson> getLessonList() {
        return lessonList;
    }

    public void setLessonList(List<Lesson> lessonList) {
        this.lessonList = lessonList;
    }

    public Course getCourseId() {
        return courseId;
    }

    public void setCourseId(Course courseId) {
        this.courseId = courseId;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (unitId != null ? unitId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Unit)) {
            return false;
        }
        Unit other = (Unit) object;
        if ((this.unitId == null && other.unitId != null) || (this.unitId != null && !this.unitId.equals(other.unitId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Unit[ unitId=" + unitId + " ]";
    }

}

это jsf-страница создания курса:

<h:form id="CourseCreateForm" enctype="multipart/form-data">
                <h:panelGroup id="display">
                    <p:panelGrid columns="2" rendered="#{courseController.selected != null}">

                        <p:outputLabel value="#{admin.CreateCourseLabel_sectionId}" for="sectionId" />
                        <h:selectOneMenu id="sectionId" value="#{courseController.selected.sectionId}" required="true" requiredMessage="#{admin.EditCourseRequiredMessage_sectionId}">
                            <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{sectionController.itemsAvailableSelectOne}"
                                           var="sectionIdItem"
                                           itemLabel="#{sectionIdItem.sectionName}"
                                           itemValue="#{sectionIdItem}"/>
                        </h:selectOneMenu>

                        <p:outputLabel value="#{admin.CreateCourseLabel_courseName}" for="courseName" />
                        <p:inputText id="courseName" value="#{courseController.selected.courseName}" title="#{admin.CreateCourseTitle_courseName}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_courseName}"/>
                        <p:outputLabel value="#{admin.CreateCourseLabel_courseDesc}" for="courseDesc" />
                        <p:inputText id="courseDesc" value="#{courseController.selected.courseDesc}" title="#{admin.CreateCourseTitle_courseDesc}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_courseDesc}"/>
                        <p:outputLabel value="#{admin.CreateCourseLabel_coursehours}" for="coursehours" />
                        <p:inputText id="coursehours" value="#{courseController.selected.coursehours}" title="#{admin.CreateCourseTitle_coursehours}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_coursehours}"/>
                        <p:outputLabel value="#{admin.CreateCourseLabel_courseUnits}" for="courseUnits" />
                        <p:inputText id="courseUnits" value="#{courseController.selected.courseUnits}" title="#{admin.CreateCourseTitle_courseUnits}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_courseUnits}"/>
                        <p:outputLabel value="#{admin.CreateCourseLabel_coursePoints}" for="coursePoints" />
                        <p:inputText id="coursePoints" value="#{courseController.selected.coursePoints}" title="#{admin.CreateCourseTitle_coursePoints}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_coursePoints}"/>

                        <p:outputLabel value="#{admin.CreateCourseLabel_coursePhoto}" for="coursePhoto" />
                        <p:inputText id="coursePhoto" value="#{courseController.selected.coursePhoto}" title="#{admin.CreateCourseTitle_coursePhoto}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_coursePhoto}"/>

                        <p:outputLabel value="test" for="coursePhotoa" />
                        <p:fileUpload id="coursePhotoa" auto="true" fileUploadListener="#{photoUploader.upload}" mode="simple" dragDropSupport="false" sizeLimit="100000" fileLimit="1" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />

                        <p:outputLabel  value="#{admin.CreateCourseLabel_courseLevel}" for="courseLevel" />
                        <p:inputText id="courseLevel" value="#{courseController.selected.courseLevel}" title="#{admin.CreateCourseTitle_courseLevel}" required="true" requiredMessage="#{admin.CreateCourseRequiredMessage_courseLevel}"/>
                        <p:outputLabel value="#{admin.CreateCourseLabel_courseActive}" for="courseActive" />
                        <p:selectBooleanCheckbox id="courseActive" value="#{courseController.selected.courseActive}" required="true" requiredMessage="#{admin.EditCourseRequiredMessage_courseActive}"/>

                        <p:outputLabel value="#{admin.CreateCourseLabel_achievementId}" for="achievementId" />
                        <h:selectOneMenu id="achievementId" value="#{courseController.selected.achievementId}" >
                            <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{achievementsController.itemsAvailableSelectOne}"
                                           var="achievementIdItem"
                                           itemLabel="#{achievementIdItem.achievementName}"
                                           itemValue="#{achievementIdItem}"/>
                        </h:selectOneMenu>
                        <p:outputLabel value="#{admin.CreateCourseLabel_languageId}" for="languageId" />
                        <h:selectOneMenu id="languageId" value="#{courseController.selected.languageId}" required="true" requiredMessage="#{admin.EditCourseRequiredMessage_languageId}">
                            <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{languageController.itemsAvailableSelectOne}"
                                           var="languageIdItem"
                                           itemLabel="#{languageIdItem.languageName}"
                                           itemValue="#{languageIdItem}"/>
                        </h:selectOneMenu>

                        <p:outputLabel value="#{admin.CreateCourseLabel_quizId}" for="quizId" />
                        <h:selectOneMenu id="quizId" value="#{courseController.selected.quizId}" >
                            <f:selectItem itemLabel="Select One" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{quizController.itemsAvailableSelectOne}"
                                           var="quizIdItem"
                                           itemLabel="#{quizIdItem.quizName}"
                                           itemValue="#{quizIdItem}"/>
                        </h:selectOneMenu>
                    </p:panelGrid>
                    <p:commandButton actionListener="#{courseController.create}" value="#{admin.Save}" update="display,:CourseListForm:datalist,:growl" oncomplete="handleSubmit(args,'CourseCreateDialog');">
                        <f:actionListener binding="#{courseController.createUnit}" />
                    </p:commandButton>
                    <p:commandButton value="#{admin.Cancel}" onclick="PF('CourseCreateDialog').hide()"/>
                </h:panelGroup>
            </h:form>

и этот метод создания в курсе manged bean:

public void create() {
        persist(PersistAction.CREATE, ResourceBundle.getBundle("/Admin").getString("CourseCreated"));
        if (!JsfUtil.isValidationFailed()) {
            items = null;    // Invalidate list of items to trigger re-query.
        }
    }
29.06.2015

Ответы:


1

Сначала несколько замечаний:

  1. Вы не должны добавлять конструктор с идентификатором. Идентификатор с @GeneratedValue устанавливается вашим поставщиком JPA (соответственно вашей базой данных) автоматически, даже без конструктора (то же самое относится к setUnitId).
  2. Вам не нужна аннотация @JoinColumn, аннотации @ManyToOne(optional = false) уже достаточно - до тех пор, пока вы называете Курс course (а не courseId).
  3. Вы показываете реализацию Unit, но говорите о сущности Course.

Тем не менее результат тот же:

public class Course {
     ...
     @OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
     private List<Unit> units = new ArrayList<>();

     public int getCourseUnits() {
          return units.size();
     }

     public void setCourseUnits(int numberOfUnits) {
          if (units.size() > numberOfUnits) {
              units.sublist(numberOfUnits, units.size()).clear();
          } else {
              for (int i = units.size(); i < numberOfUnits; i++) {
                  Unit unit = new Unit();
                  unit.setUnitNumber(i);
                  units.add(unit);
              }
          }
     }
}
29.06.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..