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";
}
}

