Thursday, 31 May 2012

One to many relationship in hibernate using annotation -1

Now a days every company using orm tool to connect with the database. There are so many tools are available in the market like hibernate, ibatis and toplink etc.
In the all the ORM tool hibernate is mostly used in the IT.
In the Hibernate we can also implement data base relation ship like one-to-one, one-to-many,many-to-one. Here i'm going to explain one-to-many relationship using hibernate annotation.

According to the relationship a student can attend any number of courses.
To create this relationship we need to have a STUDENT and COURSE table. The relational model shown below-

We can create this relation in two ways -
  1. we will create a column in the course table which will have student id for that course.
  2. we will create a intermediate table which has course id and student id.

Here we discuss by creating a column in the course(Child Table)table. This column shows the one to many relationship between parent (Student) table and child (Course) table. This column can have same value for multiple records of the course table because a student id can be belongs to the multiple course to show which are courses are applied by a particular student. One more important thing is the studentId should be the primary key of the student table.

First we will a Student class which will be responsible for the student table. In the Student table we have following field like studentId,studentName and we have one more field of Set of course. This field doesn't have any mapped column but this field is required to make one to many relationship. This field have all the course detail of a student for which he/she applied.
Here we used some annotation like @table, @column,@JoinColumn etc. We will discuss later.

In the Student class, we have mapping of different field with the different columns.
  1. Student class mapped to the STUDENT TABLE.
  2. studentId Mapped to STUDENT_ID column.
  3. studentName mapped to student_name column.
  4. courses didn't mapped to any column, but we are using @OneToMany annotation any showing that the join column is STD_ID.

Now We need a Course table. We will create a with the name of Course. Course class is responsible for the COURSE table. COURSE Table we have 2 column course_ID and course_name. our course class will be look like

  1. Course class mapped to the COURSE TABLE.
  2. courseId Mapped to course_ID column.
  3. courseName mapped to course_name column.

As of now we used 4-5 annotations now its time get understand about these annotation
@Table used to map with a class to a Database Table
@Id shows this the id for the table.
@GeneratedValue shows the value of Id should be generate by the database itself.
@Column used to map a field to database column.
@OneToMany shows the one-to-many relationship between two tables.
@JoinColumn which join column used to make the relationship.
@Cascade which action should be taken for the child table depend on the parent table action like delete, update.

Till now we created both table STUDENT and Course. Now we have to write a class which can use hibernate to create the table and insert the record.

After executing above code we will 2 tables in the hibernate as below

We can see that one extra column with the name of STUDENT_ID is exist in the Course Table, if we look at the code of course class there is no field with name of Student_id.In the Student table we have a annotation @joinColumn, this annotation is responsible for this extra column in the course table. There is issue in the above implemention. After getting the course Object through hibernate, we cann't get the which studentId is Responsible for this course record. Other issue is we cann't find the Course object through student Id because while executing a query there is no field in the course class which map to studentId To overcome this problem we have to add below statement in the course class

Saturday, 26 May 2012

How to do field validation using the Acegi security in spring

Hi Friends , Today i am going to explain about the validation of username or password while using the Acegi security in spring. let assume our application is using the form based authentication and user clicks on the submit button without entering the field(username,password) value, Acegi security internally executes the query. Here no point in executing the query.

In the terms of DB transaction it is costly operation. In other word , if in our application some pattern is defined for username and password like username shouldn't contain special character etc.Then this type of validation we could do before the request goes to the acegi security otherwise it would be unusual operation. To stop this unusual operation we can modify our code.

We can check before submitting to the server that the values entered by user are satisfied the required format if no then we can show the login page with appropriate error message. Here using this technique we can save so many db interactions.
For that we have to change the following code

login.htm will be mapped to controller. A delegate Controller will use a Model which having 2 parameter with the name of j_username and j_password it validated both field value based on the define rule once the validation passes then it will navigate to success jsp.
In the success jsp we have a java script , called by onLoad event. in this function we have to write following code

Now it will work fine.