2017-03-12 14 views
1

我是新來的JavaEE,我在使用實體類和ejb的實體管理器持久存在一個外鍵指向另一個表的主鍵的表時遇到問題。我正在使用Netbeans。使用EJB和JPA持久保留帶有外鍵的表我使用EJB和JPA

我有一個名爲「財產」的實體,並有另一個實體叫'offer',它持有指向屬性主鍵的外鍵。所以基本上,邏輯是一個財產可以有很多優惠。因此,我試圖使用實體管理器在'offer'表中添加新的優惠,但我無法做到這一點。你可以看看代碼,看看我可能錯過了什麼。

屬性實體:

@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); 
    } 

} 

發售實體:

@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的JSP與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); 

我失去了一些東西在這裏?我遵循了一個沒有外鍵指導的教程,但試圖用我自己的邏輯繞過它,但它沒有奏效。我無法找到使用類似於我的方法的可靠來源。我發現的大部分資源都是針對Hibernate的,但我使用的是EJB。

+0

最新的實際錯誤?這個聲明:Property property = propertyDAO.GetProperty(propertyId);給非空結果?添加Property實體代碼。 –

+0

@MaciejKowalski我已添加。它不顯示任何錯誤消息,也不會將數據輸入到數據庫中,這是令我困惑的。 –

回答

0

我修好了它。如果您查看servlet的代碼,則說明我的if條件會檢查操作參數。如果行動不是空的,它會檢查行動是否爲空。我發現這個問題的方法是創建一個整數,當它達到代碼中的某些階段時自增。

我認爲你是對的事實,我不得不在同一事務上獲取屬性ID和買家ID。否則,這將是我的下一個問題。謝謝。

+1

好吧。很高興我能幫上忙 –

0

似乎檢索Property的方法和持久化Offer的方法在單獨的事務中運行(DAO是無狀態會話Bean)。

這意味着要約將被填充並與分離的屬性保持一致,因此持久性提供者不知道它。

不知道爲什麼一個異常沒有提出,但你必須首先合併物業或做在同一個事務查詢,你堅持的發售:

@Override 
public void Add(Offer offer, int peropertyId) { 
    Property property = em.find(Property.class, propertyId); 
    offer.setPeropertyId(property); 
    em.persist(offer); 
} 

@Override 
public void Add(Offer offer, Property peroperty) { 
    Property managedProperty = em.merge(property); 
    offer.setPeropertyId(managedProperty); 
    em.persist(offer); 
} 
+0

感謝您的回覆。我應用了您的解決方案,但仍然無法正常工作。我很困惑,這是如何工作的,因爲外鍵是一個整數而不是一個對象,所以對象Property如何進入Offer的包含一個整數的propertyId的外鍵。 –

+1

是與買方保存的買方? –

+0

是的,但仍然。這將是最好的,如果它甚至向我展示了它的例外,但它不是真的很麻煩 –