Creating EJB data with composite primary keys

I have two related entity beans and I am using a servlet to write persistent data to both of them at the same time. When I populate the first bean, the data persists.

However, when calling the relevant method of the second EB's session bean, I get NullPointerException errors but I cannot see why.

The second entity bean has a composite key.

I know the problem is to do with the method calls but I am uncertain about which to use.

I attach the relevant code.

Any help would be welcome as I am new to EJB.

Thanks

Martin O'Shea.

CompositeName class:

package Fred;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.EmbeddedId;

import javax.persistence.Entity;

import javax.persistence.JoinColumn;

import javax.persistence.ManyToOne;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

@Entity

@Table(name ="COMPOSITE_NAME")

@NamedQueries({

@NamedQuery(name ="CompositeName.findByFirstName", query ="SELECT c FROM CompositeName c WHERE c.compositeNamePK.firstName = :firstName"),

@NamedQuery(name ="CompositeName.findByLastName", query ="SELECT c FROM CompositeName c WHERE c.compositeNamePK.lastName = :lastName"),

@NamedQuery(name ="CompositeName.findByGrade", query ="SELECT c FROM CompositeName c WHERE c.grade = :grade")

})

publicclass CompositeNameimplements Serializable{

@EmbeddedId

protected CompositeNamePK compositeNamePK;

@Column(name ="GRADE")

private String grade;

@JoinColumn(name ="FIRST_NAME", referencedColumnName ="FIRST_NAME", insertable = false, updatable =false)

@ManyToOne

private SingleName singleName;

public CompositeName(){

}

public CompositeName(CompositeNamePK compositeNamePK){

this.compositeNamePK = compositeNamePK;

}

public CompositeName(String lastName, String firstName){

this.compositeNamePK =new CompositeNamePK(lastName, firstName);

}

public CompositeNamePK getCompositeNamePK(){

return this.compositeNamePK;

}

publicvoid setCompositeNamePK(CompositeNamePK compositeNamePK){

this.compositeNamePK = compositeNamePK;

}

public String getGrade(){

return this.grade;

}

publicvoid setGrade(String grade){

this.grade = grade;

}

public SingleName getSingleName(){

return this.singleName;

}

publicvoid setSingleName(SingleName singleName){

this.singleName = singleName;

}

@Override

publicint hashCode(){

int hash = 0;

hash += (this.compositeNamePK !=null ? this.compositeNamePK.hashCode() : 0);

return hash;

}

@Override

publicboolean equals(Object object){

// TODO: Warning - this method won't work in the case the id fields are not set

if (!(objectinstanceof CompositeName)){

returnfalse;

}

CompositeName other = (CompositeName)object;

if (this.compositeNamePK != other.compositeNamePK && (this.compositeNamePK ==null || !this.compositeNamePK.equals(other.compositeNamePK)))returnfalse;

returntrue;

}

@Override

public String toString(){

return"Fred.CompositeName[compositeNamePK=" + compositeNamePK +"]";

}

}

CompositeNamePKclass:

package Fred;

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Embeddable;

@Embeddable

publicclass CompositeNamePKimplements Serializable{

@Column(name ="FIRST_NAME", nullable =false)

private String firstName;

@Column(name ="LAST_NAME", nullable =false)

private String lastName;

public CompositeNamePK(){

}

public CompositeNamePK(String lastName, String firstName){

this.lastName = lastName;

this.firstName = firstName;

}

public String getFirstName(){

return this.firstName;

}

publicvoid setFirstName(String firstName){

this.firstName = firstName;

}

public String getLastName(){

return this.lastName;

}

publicvoid setLastName(String lastName){

this.lastName = lastName;

}

@Override

publicint hashCode(){

int hash = 0;

hash += (this.lastName !=null ? this.lastName.hashCode() : 0);

hash += (this.firstName !=null ? this.firstName.hashCode() : 0);

return hash;

}

@Override

publicboolean equals(Object object){

if (!(objectinstanceof CompositeNamePK)){

returnfalse;

}

CompositeNamePK other = (CompositeNamePK)object;

if (this.lastName != other.lastName && (this.lastName ==null || !this.lastName.equals(other.lastName)))returnfalse;

if (this.firstName != other.firstName && (this.firstName ==null || !this.firstName.equals(other.firstName)))returnfalse;

returntrue;

}

@Override

public String toString(){

return"Fred.CompositeNamePK[lastName=" + lastName +", firstName=" + firstName +"]";

}

}

CompositeNameFacadeclass:

package Fred;

import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

@Stateless

publicclass CompositeNameFacadeimplements CompositeNameFacadeLocal{

@PersistenceContext

private EntityManager em;

public CompositeNameFacade(){

}

publicvoid create(CompositeName compositeName){

em.persist(compositeName);

}

publicvoid edit(CompositeName compositeName){

em.merge(compositeName);

}

publicvoid destroy(CompositeName compositeName){

em.merge(compositeName);

em.remove(compositeName);

}

public CompositeName find(Object pk){

return (CompositeName) em.find(CompositeName.class, pk);

}

public List findAll(){

return em.createQuery("select object(o) from CompositeName as o").getResultList();

}

}

Servlet Test.java:

package Fred;

import java.io.*;

import javax.ejb.EJB;

import javax.ejb.EJBException;

import javax.persistence.RollbackException;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.transaction.TransactionRolledbackException;

publicclass Testextends HttpServlet{

@EJB

private SingleNameFacadeLocal singleNameFacade;

private CompositeNameFacadeLocal compositeNameFacade;

protectedvoid processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Servlet Test</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>Servlet Test at " + request.getContextPath () +"</h1>");

out.println("<h2>Creating person ...</h2>");

SingleName s =new SingleName();

s.setFirstName("Montague");

try{

singleNameFacade.create(s);

}

catch (EJBException e){

out.println("<h2>Duplicate not created ...</h2>");

}

CompositeNamePK c =new CompositeNamePK();

c.setFirstName("Montague");

c.setLastName("Ponsonby");

CompositeName d =new CompositeName();

d.setCompositeNamePK(c);

d. setGrade("AAA");

compositeNameFacade.create(d);

out.println("<h2>Created person ...</h2>");

out.println("</body>");

out.println("</html>");

out.close();

}

protectedvoid doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

processRequest(request, response);

}

protectedvoid doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

processRequest(request, response);

}

public String getServletInfo(){

return"Short description";

}

}

[16337 byte] By [MartinOSheaa] at [2007-11-27 7:53:56]
# 1
Which line is reported for the exception?
r035198xa at 2007-7-12 19:35:12 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 2
This problem is now resolved.
MartinOSheaa at 2007-7-12 19:35:12 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...