2014-06-17 28 views
6

voglio creare un uno a molti rapporti e ho usato il seguente service.xml:Liferay Servizio Builder 6.2: molti a uno rapporti

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

mio problema è che nulla viene creato per il metodo di collezioni . Nessuna eccezione, niente. Le classi sono generate e ci sono i metodi getter semplici ma non getCourse().

Cosa sto facendo male?

risposta

7

I getter non vengono creati automaticamente per te. Ogni entità rappresenta una tabella nel database, quindi dovrai creare getter che ritieni utili. Fortunatamente, Service Builder è anche in grado di generare questo se necessario.

In primo luogo, chiediamo a Service Builder di creare una tabella di mappatura tra e 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> 

successivo, creiamo il metodo appropriato in CourseLocalServiceImpl:

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

    return coursePersistence.getCourses(studentId); 
} 

Per ottenere Courses dall'oggetto Student creiamo metodo all'interno della generato StudentImpl.java:

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

Infine, rigenerare classi eseguendo ant build-service.

Ora siamo in grado di ottenere tutti i corsi di uno studente sta prendendo scrivendo:

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

o

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

Ok, questo funziona. Ma ci lascia con colonne di database indesiderate (studentId) per la tabella del corso, giusto? – Breiti

+0

Nell'XL Service Generator che hai fornito sopra, 'studentId' era già una colonna della tabella' course'. –

+0

ok, vero;) Questo è un mio errore. C'è un modo per sbarazzartene? Per avere solo il getter per la lista? E, seconda domanda: non c'è modo di ottenere quegli elementi da un elemento studente? – Breiti

6

Liferay in tutta la sua versione hanno specificato, che aiuta a spostare da cima a fondo approccio.

prega di fare riferimento questo primo:

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

Per spontanea aggiuntivo seguente codice

<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 accumulo di servizio e sulla corretta esecuzione vedrete i metodi getter setter.