Search code examples
javajpaejbderby

Persisting a table with foreign keys using EJB and JPA


I am new to JavaEE and I am having a problem with persisting a table that has foreign keys pointing to the primary key of another table using entity classes and ejb's entity manager. I am using Netbeans.

I have an entity called 'property' and have another entity called 'offer' which holds the foreign key pointing to the primary key of the property. So basically, the logic is that one property can have many offers. Therefore, I am trying to add new offers in the 'offer' table using the entity manager but I am not being able to do it. You can look at the code and see what I maybe missing.

Property entity:

@Entity
@Table(name = "PROPERTY")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Property.findAll", query = "SELECT p FROM Property p")})
public class Property implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "PROPERTYID")
    private Integer propertyid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 500)
    @Column(name = "DESCRIPTION")
    private String description;
    @Size(max = 50)
    @Column(name = "TYPE")
    private String type;
    @Column(name = "NUMBEROFBEDROOM")
    private Integer numberofbedroom;
    @Column(name = "NUMBEROFBATHROOM")
    private Integer numberofbathroom;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "ISFURNISHED")
    private String isfurnished;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "HASGARDEN")
    private String hasgarden;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "SIZE")
    private String size;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "PRICE")
    private String price;
    @Basic(optional = false)
    @NotNull
    @Column(name = "ENTEREDDATE")
    @Temporal(TemporalType.DATE)
    private Date entereddate;
    @Basic(optional = false)
    @NotNull
    @Column(name = "ENTEREDTIME")
    @Temporal(TemporalType.TIME)
    private Date enteredtime;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "property")
    private Paddress paddress;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "propertyid")
    private Collection<Offer> offerCollection;
    @JoinColumn(name = "PROPERTYOWNERID", referencedColumnName = "PROPERTYOWNERID")
    @ManyToOne(optional = false)
    private Propertyowner propertyownerid;
    @JoinColumn(name = "REALESTATEAGENTID", referencedColumnName = "REALESTATEAGENTID")
    @ManyToOne(optional = false)
    private Realestateagent realestateagentid;

    public Property() {
    }

    public Property(Integer propertyid) {
        this.propertyid = propertyid;
    }

    public Property(Integer propertyid, String description, String isfurnished, String hasgarden, String size, String price, Date entereddate, Date enteredtime) {
        this.propertyid = propertyid;
        this.description = description;
        this.isfurnished = isfurnished;
        this.hasgarden = hasgarden;
        this.size = size;
        this.price = price;
        this.entereddate = entereddate;
        this.enteredtime = enteredtime;
    }

    public Integer getPropertyid() {
        return propertyid;
    }

    public void setPropertyid(Integer propertyid) {
        this.propertyid = propertyid;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Integer getNumberofbedroom() {
        return numberofbedroom;
    }

    public void setNumberofbedroom(Integer numberofbedroom) {
        this.numberofbedroom = numberofbedroom;
    }

    public Integer getNumberofbathroom() {
        return numberofbathroom;
    }

    public void setNumberofbathroom(Integer numberofbathroom) {
        this.numberofbathroom = numberofbathroom;
    }

    public String getIsfurnished() {
        return isfurnished;
    }

    public void setIsfurnished(String isfurnished) {
        this.isfurnished = isfurnished;
    }

    public String getHasgarden() {
        return hasgarden;
    }

    public void setHasgarden(String hasgarden) {
        this.hasgarden = hasgarden;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public Date getEntereddate() {
        return entereddate;
    }

    public void setEntereddate(Date entereddate) {
        this.entereddate = entereddate;
    }

    public Date getEnteredtime() {
        return enteredtime;
    }

    public void setEnteredtime(Date enteredtime) {
        this.enteredtime = enteredtime;
    }

    public Paddress getPaddress() {
        return paddress;
    }

    public void setPaddress(Paddress paddress) {
        this.paddress = paddress;
    }

    @XmlTransient
    public Collection<Offer> getOfferCollection() {
        return offerCollection;
    }

    public void setOfferCollection(Collection<Offer> offerCollection) {
        this.offerCollection = offerCollection;
    }

    public Propertyowner getPropertyownerid() {
        return propertyownerid;
    }

    public void setPropertyownerid(Propertyowner propertyownerid) {
        this.propertyownerid = propertyownerid;
    }

    public Realestateagent getRealestateagentid() {
        return realestateagentid;
    }

    public void setRealestateagentid(Realestateagent realestateagentid) {
        this.realestateagentid = realestateagentid;
    }

    public String dateToString()
    {
        DateFormat df = new SimpleDateFormat("dd/MM/yy");
        return df.format(entereddate);
    }

    public String timeToString()
    {
        DateFormat df = new SimpleDateFormat("HH:mm:ss");
        return df.format(enteredtime);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (propertyid != null ? propertyid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Property)) {
            return false;
        }
        Property other = (Property) object;
        if ((this.propertyid == null && other.propertyid != null) || (this.propertyid != null && !this.propertyid.equals(other.propertyid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.sushan.model.Property[ propertyid=" + propertyid + " ]";
    }

}

EJB PropertyDAO:

@Stateless
public class PropertyDAO implements PropertyDAOLocal {
    @PersistenceContext(unitName="RealEstateWebsite-ejbPU")
    private EntityManager em;

    @Override
    public void AddProperty(Property property) {
        em.persist(property);
    }

    @Override
    public void EditProperty(Property property) {
        em.merge(property);
    }

    @Override
    public void DeleteProperty(int propertyId) {
        em.remove(GetProperty(propertyId));
    }

    @Override
    public List<Property> GetAllProperty() {
        return em.createNamedQuery("Property.findAll").getResultList();
    }

        @Override
    public Property GetProperty(int propertyId) {
        return em.find(Property.class, propertyId);
    }  

    @Override
    public void EditPropertyAddress(Paddress propertyAddress) {
       em.merge(propertyAddress);
    }

}

Offer entity:

@Entity
@Table(name = "OFFER")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Offer.findAll", query = "SELECT o FROM Offer o")})
public class Offer implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "OFFERID")
    private Integer offerid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "OFFERSTATUS")
    private String offerstatus;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "ORIGINALOFFER")
    private String originaloffer;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 100)
    @Column(name = "OFFERINGBP")
    private String offeringbp;
    @Basic(optional = false)
    @NotNull
    @Column(name = "OFFEREDDATE")
    @Temporal(TemporalType.DATE)
    private Date offereddate;
    @Basic(optional = false)
    @NotNull
    @Column(name = "OFFEREDTIME")
    @Temporal(TemporalType.TIME)
    private Date offeredtime;
    @JoinColumn(name = "BUYERID", referencedColumnName = "BUYERID")
    @ManyToOne(optional = false)
    private Buyer buyerid;
    @JoinColumn(name = "PROPERTYID", referencedColumnName = "PROPERTYID")
    @ManyToOne(optional = false)
    private Property propertyid;

    public Offer() {
    }

    public Offer(Integer offerid) {
        this.offerid = offerid;
    }

    public Offer(String offerstatus, String originaloffer, String offeringbp, Date offereddate, Date offeredtime, Buyer buyerid, Property propertyid) {
        this.offerstatus = offerstatus;
        this.originaloffer = originaloffer;
        this.offeringbp = offeringbp;
        this.offereddate = offereddate;
        this.offeredtime = offeredtime;
        this.buyerid = buyerid;
        this.propertyid = propertyid;

    }

    public Integer getOfferid() {
        return offerid;
    }

    public void setOfferid(Integer offerid) {
        this.offerid = offerid;
    }

    public String getOfferstatus() {
        return offerstatus;
    }

    public void setOfferstatus(String offerstatus) {
        this.offerstatus = offerstatus;
    }

    public String getOriginaloffer() {
        return originaloffer;
    }

    public void setOriginaloffer(String originaloffer) {
        this.originaloffer = originaloffer;
    }

    public String getOfferingbp() {
        return offeringbp;
    }

    public void setOfferingbp(String offeringbp) {
        this.offeringbp = offeringbp;
    }

    public Date getOffereddate() {
        return offereddate;
    }

    public void setOffereddate(Date offereddate) {
        this.offereddate = offereddate;
    }

    public Date getOfferedtime() {
        return offeredtime;
    }

    public void setOfferedtime(Date offeredtime) {
        this.offeredtime = offeredtime;
    }

    public Buyer getBuyerid() {
        return buyerid;
    }

    public void setBuyerid(Buyer buyerid) {
        this.buyerid = buyerid;
    }

    public Property getPropertyid() {
        return propertyid;
    }

    public void setPropertyid(Property propertyid) {
        this.propertyid = propertyid;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (offerid != null ? offerid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Offer)) {
            return false;
        }
        Offer other = (Offer) object;
        if ((this.offerid == null && other.offerid != null) || (this.offerid != null && !this.offerid.equals(other.offerid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.sushan.model.Offer[ offerid=" + offerid + " ]";
    }

EJB OfferDAO:

@Stateless
public class OfferDAO implements OfferDAOLocal {

    @PersistenceContext(unitName="RealEstateWebsite-ejbPU")
    EntityManager em;

    @Override
    public void EditOffer(Offer offer) {
        em.merge(offer);
    }

    @Override
    public List<Offer> GetAllOffer(int propertyId) {
        return em.createNamedQuery("Offer.findByPropertyID").setParameter("propertyID", propertyId).getResultList();
    }

    @Override
    public List<Offer> GetAllOffer() {
        return em.createNamedQuery("Offer.findAll").getResultList();
    }

    @Override
    public void Add(Offer offer) {
        em.persist(offer);
    }
}

Servlet that connects the JSP with the EJB:

String action = request.getParameter("action");
        String currencyType = request.getParameter("ddlCurrencyType");
        String amount = request.getParameter("offerAmount");
        String propertyIdStr = request.getParameter("hdnbt");

        if ("Offer".equalsIgnoreCase(action))
        {
            if ("".equals(action) & !"".equals(currencyType) & !"".equals(amount) & !"".equals(propertyIdStr))
            {               
                DateFormat df = new SimpleDateFormat("dd/MM/yy");
                DateFormat df1 = new SimpleDateFormat("HH:mm:ss");
                Date currentDate = new Date();
                Date currentTime = new Date();

                int propertyId = Integer.parseInt(propertyIdStr);

                try {
                currentDate = df.parse(df.format(currentDate));
                currentTime = df1.parse(df1.format(currentTime));
                } catch (ParseException e) {
                }
                Buyer buyer = buyerDAO.GetBuyer(1);
                Property property = propertyDAO.GetProperty(propertyId);
                Offer offer = new Offer("Pending", amount, amount, currentDate, currentTime, buyer, property);
                offerDAO.Add(offer);
            }
            else
            {

            }
        }       
        request.setAttribute("allProperty", propertyDAO.GetAllProperty());
        request.getRequestDispatcher("AdministerProperty.jsp").forward(request, response);

Am I missing something here? I have followed a tutorial which didn't have a foreign key guidance but tried to use my own logic to go around it but it didn't work. I cannot find a reliable source that uses the method similar to me. Most of the resources I find are for Hibernate but I am using EJB.


Solution

  • I fixed it. If you look at the code for servlet, it was the problem with my if condition that checks the action parameter. It was meant to be if action is not empty but it checks if action is empty. I found this issue by creating an integer that increments itself when it reaches certain stages within the code.

    I think you were right on the fact that I had to do the getting property id and buyer id on the same transaction. Otherwise that would have been the next issue for me. Thank you.