Skip to main content

Hibernate - Mapping a parent/children relationship

The first thing many developer try to do when they begin using Hibernate is a mapping of a parent/children relationship. this is usually the first time you encounter collections. it's also the first time you have to think about the differences between entities and value tyhpes, or get lost in the complexity of ORM.

Managing the associations between classes and the relationships between tables is at the heart of ORM. Most of the difficult problems involved in implementing an ORM solution relate to association management.

POJO-oriented persistence engines such as Hibernate don't implement managed associations, and POJO stands such as EJB3.0 and Java Persistence don't require managed assocations. contrary to EJB2.0 CMR, Hibernate and JPA associations are all inherently unidirectional.

Use Bid and Item ( for auction) as the example,
As far as Hibernate is concerned, the association from Bid to Item is a different association than the association from Item to Bid! The association from Bid to Item is a many-to-one assocation. Recalling that associations are directional, you classify the inverse association from item to bid as a one-to-many association.

The association from Bid to Item(and vice versa) is an example of the simplest possible kind of entity association. You have two properties in two classes. One is a collection of references, and the other a single reference.


public class Bid {
...
private Item item;
public void setItem(Item item) {
this.item = item;
}
public Item getItem() {
return item;
}
...
}
Next, this is the Hibernate mapping for this association:
<class
name="Bid"
table="BID">
...
<many-to-one
name="item"
column="ITEM_ID"
class="Item"
not-null="true"/>
</class>

OR in JPA:


public class Bid {
...
@ManyToOne( targetEntity = auction.model.Item.class )
@JoinColumn(name = "ITEM_ID", nullable = false)
private Item item;
...
}




There are two optional elements in this mapping. First, you don't have to include the targetEntity of the association; it's implicit from the type of the field.
The second optoinal element is the @JoinColumn. If you don't declare the name of the foreign key column, Hibernate automatically uses a combination of the target entity name and the database identifier proprety name of the target entity. In other words, if you don't add a @JoinColumn annotation, the default name for the foreign key colum is item plus id, separated with an underscore. However, because you want to make the foreign key column not null, you need to annotation anyway to set nullable=false.




public class Item {
...
private Set bids = new HashSet();
public void setBids(Set bids) {
this.bids = bids;
}
public Set getBids() {
return bids;
}
public void addBid(Bid bid) {
bid.setItem(this);
bids.add(bid);
}
...
}


<class
name="Item"
table="ITEM">
...
<set name="bids">
<key column="ITEM_ID"/>

<one-to-many class="Bid"/>
</set>
</class>

OR in JPA:









Comments

Popular posts from this blog

Stretch a row if data overflows in jasper reports

It is very common that some columns of the report need to stretch to show all the content in that column. But  if you just specify the property " stretch with overflow' to that column(we called text field in jasper report world) , it will just stretch that column and won't change other columns, so the row could be ridiculous. Haven't find the solution from internet yet. So I just review the properties in iReport one by one and find two useful properties(the bold highlighted in example below) which resolve the problems.   example:
<band height="20" splitType="Stretch"> <textField isStretchWithOverflow="true" pattern="" isBlankWhenNull="true"> <reportElement stretchType="RelativeToTallestObject" mode="Opaque" x="192" y="0" width="183" height="20"/> <box leftPadding="2"> <pen lineWidth="0.25"/> …

JasperReports - Configuration Reference

Spring - Operations with jdbcTemplate

This class manages all the database communication and exception handling using a java.sql.Connection that is obtained from the provided DataSource. JdbcTemplate is a stateless and threadsafe class and you can safely instantiate a single instance to be used for each DAO.


Use of Callback Methods
JdbcTemplate is based on a template style of programming common to many other parts of Spring. Some method calls are handled entirely by the JdbcTemplate, while others require the calling class to provide callback methods that contain the implementation for parts of the JDBC workflow. This is another form of Inversion of Control. Your application code hands over the responsibility of managing the database access to the template class. The template class in turn calls back to your application code when it needs some detail processing filled in. These callback methods are allowed to throw a java.sql.SQLException, since the framework will be able to catch this exception and use its built-in excepti…