Sunday, January 12, 2014

Liferay Service Builder Many to Many Relation in Plugin Portlet Part-I

Objective:

Implement Many to Many Relation in Liferay development using service builder tool.

In our real time development we come across Many to Many relation mapping when we interact with data base.

Hibernate Object relational mapping support one to many and many to many relations. Coming to liferay we never directly implement hibernate in liferay development and we just use service builder tool so that we can generate all data base services with minimal effort.

Liferay service builder support many to many relation in liferay.

Scenario

A student can have many courses and course can be taken by many students



Introduction:

Liferay have very good tool called service builder from which we can build required services for portlet. Services are nothing but database interaction related java classes, interfaces and its configuration files. Service builder uses spring and hibernate to build service layer for portlet.

To build service layer for portlet service builder need one configuration file called service.xml by using this it will get information to generate required service classes and interfaces.

We already aware of spring and hibernate integration in normal web applications. Same way service builder build model/POJO classes, DAO classes and service classes.

Along with java classes some spring configuration files and Hibernate mapping files will be generated.

Spring will be load all required services in application context so that we can use required methods from some Util classes

The following are the classes and interface for each entity which we defined in service.xml


XXXModel
XXXModelmpl
XXXPersistence
XXXPersistenceImpl
XXXServiceImpl
XXXLocalServiceImpl
XXXServiceUtil
XXXLocalServiceUtil
XXXUtil

Here XXX is Entity Name

Note:

In service builder each table will be referred as Entity

In Development we will use only Util classes to do database interaction


Many to Many Implementation in Liferay

Service builder can support Many to Many Relation so that we can use this functionality in real time development

In the service builder we will define entities and its columns in service.xml file from this information Service Builder generated the required services to each entity. These services will be interacted with data base tables.

Liferay providing mapping-table attribute for column from this we can achieve many to many relation between tables

What are the tables or entities which are participated in many to many relations, for those tables we have to define column and that column should have mapping-table attribute and entity attributes.

What are the column which contains mapping-table those columns are really/physically not existed in the database tables, the column are virtual columns for entity which will support many to many relation between table

When we use Many to Many Relation between tables we will use mapping –table attribute for the column. Whatever the value we provided to mapping-table attribute then service builder create another new tables with that value.

The created table will have two columns and those columns are representing each table primary keys i.e. the tables participated in May to Many Relation.

Concept Example:

Assume we have Student and Course tables. When we implement Many to Many relation between these tables we will get new table called Students_Courses and the table contains two columns and the columns are primary keys of Student and Course

This Student_Courses is the value of mapping-table attribute in entity column.

Example of service.xml

<service-builder package-path="com.meera.db">
<author>E5410</author>
<namespace>meera</namespace>
<entity name="Student" local-service="true" remote-service="true" cache-enabled="false">
<column name="studentId" type="long" primary="true" />
<column name="studentName" type="String" />
<column name="studentPlace" type="String" />
<column name="studentCollege" type="String" />
<column name="courses" type="Collection" entity="Course" mapping-table="Students_Courses"/>
</entity>
<entity name="Course" local-service="true" remote-service="true" cache-enabled="false">
<column name="courseId" type="long" primary="true" />
<column name="courseName" type="String" />
<column name="courseGroup" type="String" />
<column name="students" type="Collection" entity="Student" mapping-table="Students_Courses" />
</entity>
</service-builder>

The following table will be created in data base


create table meera_Course (
        courseId LONG not null primary key,
        courseName VARCHAR(75) null,
        courseGroup VARCHAR(75) null
);

create table meera_Student (
        studentId LONG not null primary key,
        studentName VARCHAR(75) null,
        studentPlace VARCHAR(75) null,
        studentCollege VARCHAR(75) null
);

create table meera_Students_Courses (
        courseId LONG not null,
        studentId LONG not null,
        primary key (courseId, studentId)
);


Note:

Liferay service builder created tables and the table names appended with name space.

Observation:
  • The columns which contains mapping-table attribute those column really not presented in table’s SQL as columns.
  • In service.xml we have defined only 2 tables but service builder created another tables and the table name i.e. we have provided value for mapping-table attribute in the column.
  • The mapping table has two columns these columns represents primary keys of other tables which are participated in many to many relation.


Author
Meera Prince

0 comments :

Post a Comment

Recent Posts

Recent Posts Widget

Popular Posts