2017-03-12 8 views
1

Ich bin neu in JavaEE und ich habe ein Problem mit der Persistenz einer Tabelle, die Fremdschlüssel auf den Primärschlüssel einer anderen Tabelle mit Entity-Klassen und ejb Entity Manager hat. Ich benutze Netbeans.Persistent eine Tabelle mit Fremdschlüsseln mit EJB und JPA

Ich habe eine Entität namens "property" und eine andere Entität namens "offer", die den Fremdschlüssel enthält, der auf den Primärschlüssel der Eigenschaft zeigt. Im Grunde ist die Logik, dass eine Eigenschaft viele Angebote haben kann. Daher versuche ich, neue Angebote in der "Angebot" -Tabelle mit dem Entity Manager hinzuzufügen, aber ich bin nicht in der Lage, es zu tun. Du kannst dir den Code ansehen und sehen, was ich vielleicht vermisse.

Immobilie Einheit:

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

} 

Angebot Einheit:

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

Servlets, die die JSP mit dem EJB verbindet:

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

bin ich etwas fehlt hier? Ich bin einem Tutorial gefolgt, das keine fremde Schlüsselführung hatte, aber versuchte, meine eigene Logik zu verwenden, um es zu umgehen, aber es hat nicht funktioniert. Ich kann keine zuverlässige Quelle finden, die die mir ähnliche Methode verwendet. Die meisten Ressourcen, die ich finde, sind für Hibernate, aber ich verwende EJB.

+0

Was ist der eigentliche Fehler? Ist diese Anweisung: Property-Eigenschaft = propertyDAO.GetProperty (propertyId); Gib ein Nicht-Null-Ergebnis? Fügen Sie den Code der Eigenschaftsentität hinzu. –

+0

@MaciejKowalski Ich habe es hinzugefügt. Es zeigt keine Fehlermeldung an und es gibt auch keine Daten in die Datenbank ein, was mich verwirren könnte. –

Antwort

0

Ich habe es repariert. Wenn Sie sich den Code für Servlet ansehen, war es das Problem mit meiner if Bedingung, die den Aktionsparameter überprüft. Es sollte sein, wenn die Aktion nicht leer ist, sondern prüft, ob die Aktion leer ist. Ich habe dieses Problem gefunden, indem ich eine ganze Zahl erstellt habe, die sich selbst erhöht, wenn sie bestimmte Stufen innerhalb des Codes erreicht.

Ich denke, Sie hatten Recht auf die Tatsache, dass ich die Immobilien-ID und Käufer-ID auf die gleiche Transaktion zu tun hatte. Sonst wäre das für mich die nächste Frage gewesen. Vielen Dank.

+1

Ok gut. froh, dass ich helfen konnte –

0

Es scheint, dass die Methode, die die Property abruft und die Methode, die das Angebot beharrt, in einer separaten Transaktion ausgeführt wird (DAOs sind die Stateless-Session-Beans).

Das würde bedeuten, dass das Angebot mit einer eigenständigen Eigenschaft gefüllt und beibehalten wird, so dass der Persistenzanbieter dies nicht bemerkt.

nicht sicher, warum eine Ausnahme nicht ausgelöst wird, aber Sie würden das Eigentum zuerst fusionieren oder die Abfrage in der gleichen Transaktion tun, wie Sie das Angebot bestehen:

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

oder

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

Danke für die Antwort. Ich habe deine Lösung angewendet und es funktioniert immer noch nicht.Ich bin verwirrt, wie das funktioniert, wie der Fremdschlüssel ist ein Integer und nicht ein Objekt, also wie geht das Objekt Property in Offers Fremdschlüssel von PropertyId, die eine ganze Zahl enthält. –

+1

ist der Käufer mit dem Angebot gespeichert? –

+0

Ja ist es aber trotzdem. Es wäre am besten, wenn es mir sogar die Ausnahme zeigte, die es hat, aber es ist nicht, was wirklich lästig ist –

Verwandte Themen