Liferay Service Builder 6.2: отношения «многие к одному»

Я хочу создать отношения "один ко многим" и использовал следующий файл service.xml:

<entity name="Student" local-service="true" remote-service="true" cache-enabled="false">
    <column name="studentId" type="long" primary="true" />
    <column name="courses" type="Collection" entity="Course"/>
</entity>

<entity name="Course" local-service="true" remote-service="true" cache-enabled="false">
    <column name="courseId" type="long" primary="true" />
    <column name="studentId" type="long"/>
</entity>

Моя проблема в том, что для метода коллекций ничего не создается. Ни исключения, ничего. Классы генерируются, и есть простые методы получения, но нет getCourse().

Что я делаю неправильно?


person Breiti    schedule 17.06.2014    source источник


Ответы (2)


Геттеры не создаются для вас автоматически. Каждая сущность представляет собой таблицу в базе данных, поэтому вам придется создавать любые геттеры, которые вы сочтете полезными. К счастью, Service Builder также может генерировать это, если вам нужно.

Сначала мы просим Service Builder создать таблицу сопоставления между Students и Courses.

<entity name="Student" local-service="true" remote-service="true" cache-enabled="false">
    <column name="studentId" type="long" primary="true" />

    <column name="courses" type="Collection" entity="Course" mapping-table="Courses_Students" />
</entity>

<entity name="Course" local-service="true" remote-service="true" cache-enabled="false">
    <column name="courseId" type="long" primary="true" />

    <column name="students" type="Collection" entity="Student" mapping-table="Courses_Students" />
</entity>

Далее мы создаем соответствующий метод в CourseLocalServiceImpl:

public List<Course> getStudentCourses(long studentId)
    throws PortalException, SystemException {

    return coursePersistence.getCourses(studentId);
}

Чтобы получить Courses из объекта Student, мы создаем метод внутри сгенерированного StudentImpl.java:

public List<Course> getCourses() throws Exceptions {
    return CorseLocalServiceUtil.getStudentCourses(getStudentId());
}

Наконец, заново создайте свои классы, запустив ant build-service.

Теперь мы можем получить все курсы, которые изучает студент, написав:

List<Course> courses = CourseLocalServiceUtil.getStudentCourses(studentId);

or

List<Course> courses = student.getCourses();
person rp.    schedule 17.06.2014
comment
Хорошо, это работает. Но это оставляет нам нежелательные столбцы базы данных (studentId) для таблицы курса, верно? - person Breiti; 18.06.2014
comment
В приведенном выше XML-коде Service Builder studentId уже был столбцом таблицы course. - person rp.; 18.06.2014
comment
хорошо, правда ;) Это моя ошибка. Есть ли способ избавиться от него? Чтобы иметь только геттер для List ? И второй вопрос: нет ли способа получить эти элементы из студенческого элемента? - person Breiti; 18.06.2014
comment
Ваш ответ показывает отношения «многие ко многим», а не «один ко многим», как спрашивает OP, если я не ошибаюсь. - person Prakash K; 09.09.2014

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

Сначала обратитесь к этому:

https://www.liferay.com/documentation/liferay-portal/6.2/development/-/ai/define-your-object-relational-map-liferay-portal-6-2-dev-guide-04-en

Для спонтанного добавления следующего кода

<entity name="Student" local-service="true" remote-service="true" cache-enabled="false">
    <column name="studentId" type="long" primary="true" />
    <column name="courses" type="Collection" entity="Course"/>
</entity>

<entity name="Course" local-service="true" remote-service="true" cache-enabled="false">
    <column name="courseId" type="long" primary="true" />
    <column name="studentId" type="long"/>

    <finder name="courseId" return-type="Collection">
        <finder-column name="courseId" />
    </finder>

    <finder name="studentId" return-type="Collection">
        <finder-column name="studentId" />
    </finder>
</entity>

Запустите службу сборки, и в случае успешного выполнения вы увидите методы установки геттера.

person Jay Trivedi    schedule 18.06.2014