2014-06-17 9 views
6

Ich möchte eine Eins-zu viele Beziehungen zu schaffen, und ich habe die folgende service.xml verwendet:Liferay Service-Builder 6.2: Viele zu eins-Beziehungen

<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> 

Mein Problem ist, dass nichts für die Sammlungen Methode erstellt wird . Keine Ausnahme, nichts. Die Klassen werden erzeugt und die einfachen Getter-Methoden sind da, aber kein getCourse().

Was mache ich falsch?

Antwort

7

Die Getter werden nicht automatisch für Sie erstellt. Jede Entität stellt eine Tabelle in der Datenbank dar, sodass Sie alle Getter erstellen müssen, die Sie nützlich finden. Zum Glück kann Service Builder dies auch generieren, wenn Sie es benötigen.

Zuerst wird der Service Builder aufgefordert, eine Zuordnungstabelle zwischen Students und Courses zu erstellen.

<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> 

Als Nächstes erstellen wir die entsprechende Methode in CourseLocalServiceImpl:

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

    return coursePersistence.getCourses(studentId); 
} 

Um Courses vom Student Objekt erhalten wir schaffen Methode in der generierten StudentImpl.java:

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

Schließlich regenerieren Klassen durch Ausführen ant build-service.

Jetzt können wir alle Kurse erhalten ein Student durch Schreiben nimmt:

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

oder

List<Course> courses = student.getCourses(); 
+0

Ok, das funktioniert. Aber es hinterlässt uns unerwünschte Datenbankspalten (studentId) für die Kurstabelle, oder? – Breiti

+0

In der Service Builder XML, die Sie oben angegeben haben, war 'studentId' bereits eine Spalte der' course' Tabelle. –

+0

ok, stimmt;) Das ist mein Fehler. Gibt es eine Möglichkeit, es los zu werden? Nur den Getter für die Liste zu haben? Und, zweite Frage: Gibt es keine Möglichkeit, diese Elemente von einem Schülerelement zu bekommen? – Breiti

6

Liferay in seiner Version haben Dokumentation angegeben, die von oben nach unten zu bewegen, hilft Ansatz.

Bitte lesen Sie diese zuerst:

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

Für spontane Add folgenden Code

<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> 

Run Build-Service und bei erfolgreicher Ausführung finden Sie die Getter Setter-Methoden sehen.