java - 使用 EJB 和 JPA 保留带有外键的表

标签 java jpa ejb derby

我是 JavaEE 新手,并且在使用实体类和 ejb 实体管理器持久保存一个表时遇到问题,该表的外键指向另一个表的主键。我正在使用 Netbeans。

我有一个名为“property”的实体,还有另一个名为“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);
    }
}

连接 JSP 和 EJB 的 Servlet:

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。

最佳答案

似乎检索属性的方法和保存 Offer 的方法在单独的事务中运行(DAO 是无状态 session bean)。

这意味着 Offer 是使用独立的属性来填充和持久化的,因此持久化提供者不会意识到这一点。

不确定为什么没有引发异常,但您必须先合并属性,或者在保留要约时在同一事务中执行查询:

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

关于java - 使用 EJB 和 JPA 保留带有外键的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748682/

相关文章:

java - 在更新操作中访问先前的实体

用于创建 EJB stub 的 Eclipse Kepler 'Prepare for Deployment' 选项

java - 更改 GridView 第一个列的大小

java - 然而Eclipse错误: Incompatible JVM,,无法更新JVM

java.lang.Object;无法转换为模型类 : error in Spring Boot

java - Jboss 4.2.3 GA附加部署目录

java - EJB 本地调用出现错误目标异常

java - 如何使用 JAXB 将 SimpleStringProperty 对象转换为 XML

java - 比 jdb 更好的 Java 远程调试器?

java - 尝试使用 JPA 注释保存具有复合键和基本值的映射