Know When to Use Compound Primary Keys
If you decide to write a compound primary
key class for an entity bean, you must override the
hashCode( ) and equals( )
methods. It is also common practice to override the
toString( ) method for debugging purposes.
Overriding hashCode( ) and equals( ) is important because the container uses these methods to
compare primary keys and to look up cached entity bean instances.
Implementing the equals( ) method is pretty
simple—all you have to do is compare various components of the
primary key. On the other hand, implementing hashCode( ) is harder because a poorly implemented hashCode( ) method can slow down entity bean lookups, especially if
there are a lot of instantiated beans. This happens because
application servers use
HashMap-type
structures to store primary keys, and the performance of these
structures relies on the fact that hashCode( )
returns different values for different objects.
In most cases, the implementation of hashCode( )
should depend on the data that the primary key contains. However,
there are a few generic algorithms that work well. The one shown in
Example 2-3 is taken from the
java.util.List.hashCode( )
method. This algorithm simply adds all hashcodes of the primary key
fields, multiplying each intermediate result by 31 (so that
it’s not a simple sum of hashcodes).
public class CompoundPK implements Serializable { private String str1; private String str2; private int int1; private ...