我怎样才能坚持jpa中的一对多关系?

时间:2017-05-24 04:14:15

标签: java mysql rest jpa persistence

我可以使用通过postman发送的JSON格式使用没有外键的表向数据库添加值,但是,在插入外键时我收到错误。

这是我的错误:

HTTP Status 500 - javax.persistence.RollbackException: java.lang.IllegalStateException: 
During synchronization a new object was found through a relationship that was not marked
cascade PERSIST: com.balay.entity.HaDetails[ hadID=null ].

我正在插入:

  

{
      “acceptedGender”: “既”,
      “价格”:123123.00,
      “类型”: “公寓”,
      “vacantNum”:13,
      “HADID”:4个
  }

我使用下面的post方法插入

有人可以帮助我

这是我的代码:

@javax.ejb.Stateless
@Path("com.balay.entity.hatypes")
public class HaTypesFacadeREST extends AbstractFacade<HaTypes> {

@PersistenceContext(unitName = "BalayRSPU")
private EntityManager em;

public HaTypesFacadeREST() {
    super(HaTypes.class);
}

**@POST
@Override
@Consumes({MediaType.APPLICATION_JSON})
public void create(HaTypes entity) {
    em = 
  Persistence.createEntityManagerFactory("BalayRSPU").createEntityManager();
      try{
        em.getTransaction().begin();
        em.persist(entity);
        em.getTransaction().commit();
    }finally{
        em.close();
    }
}**

@PUT
@Path("{id}")
@Consumes({MediaType.APPLICATION_JSON})
public void edit(@PathParam("id") Integer id, HaTypes entity) {
    super.edit(entity);
}

@DELETE
@Path("{id}")
public void remove(@PathParam("id") Integer id) {
    super.remove(super.find(id));
}

@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_JSON})
public HaTypes find(@PathParam("id") Integer id) {
    return super.find(id);
}

@GET
@Override
@Produces({MediaType.APPLICATION_JSON})
public List<HaTypes> findAll() {
    return super.findAll();
}

@GET
@Path("{from}/{to}")
@Produces({MediaType.APPLICATION_JSON})
public List<HaTypes> findRange(@PathParam("from") Integer from, 
@PathParam("to") Integer to) {
    return super.findRange(new int[]{from, to});
}

@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public String countREST() {
    return String.valueOf(super.count());
}

@Override
protected EntityManager getEntityManager() {
    em = 
Persistence.createEntityManagerFactory("BalayRSPU").createEntityManager();
    return em;
}

}
 @Entity
 @Table(name = "ha_types")
 @XmlRootElement
 @NamedQueries({
@NamedQuery(name = "HaTypes.findAll", query = "SELECT h FROM HaTypes h")
, @NamedQuery(name = "HaTypes.findByHatID", query = "SELECT h FROM HaTypes h 
WHERE h.hatID = :hatID")
, @NamedQuery(name = "HaTypes.findByType", query = "SELECT h FROM HaTypes h 
 WHERE h.type = :type")
, @NamedQuery(name = "HaTypes.findByAcceptedGender", query = "SELECT h FROM 
HaTypes h WHERE h.acceptedGender = :acceptedGender")
, @NamedQuery(name = "HaTypes.findByVacantNum", query = "SELECT h FROM 
HaTypes h WHERE h.vacantNum = :vacantNum")
, @NamedQuery(name = "HaTypes.findByPrice", query = "SELECT h FROM HaTypes h 
WHERE h.price = :price")})
public class HaTypes implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "hatID")
private Integer hatID;
@Basic(optional = false)
@Column(name = "type")
private String type;
@Basic(optional = false)
@Column(name = "acceptedGender")
private String acceptedGender;
@Basic(optional = false)
@Column(name = "vacantNum")
private int vacantNum;
// @Max(value=?)  @Min(value=?)//if you know range of your decimal fields 
consider using these annotations to enforce field validation
@Basic(optional = false)
@Column(name = "price")
private BigDecimal price;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hatID")
private Collection<Reservation> reservationCollection;
@JoinColumn(name = "hadID", referencedColumnName = "hadID")
@ManyToOne(optional = false)
private HaDetails hadID;

public HaTypes() {
}

public HaTypes(Integer hatID) {
    this.hatID = hatID;
}

public HaTypes(Integer hatID, String type, String acceptedGender, int 
vacantNum, BigDecimal price) {
    this.hatID = hatID;
    this.type = type;
    this.acceptedGender = acceptedGender;
    this.vacantNum = vacantNum;
    this.price = price;
}

public Integer getHatID() {
    return hatID;
}

public void setHatID(Integer hatID) {
    this.hatID = hatID;
}

public String getType() {
    return type;
}

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

public String getAcceptedGender() {
    return acceptedGender;
}

public void setAcceptedGender(String acceptedGender) {
    this.acceptedGender = acceptedGender;
}

public int getVacantNum() {
    return vacantNum;
}

public void setVacantNum(int vacantNum) {
    this.vacantNum = vacantNum;
}

public BigDecimal getPrice() {
    return price;
}

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

@XmlTransient
public Collection<Reservation> getReservationCollection() {
    return reservationCollection;
}

public void setReservationCollection(Collection<Reservation> 
reservationCollection) {
    this.reservationCollection = reservationCollection;
}

public HaDetails getHadID() {
    return hadID;
}

public void setHadID(HaDetails hadID) {
    this.hadID = hadID;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (hatID != null ? hatID.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 HaTypes)) {
        return false;
    }
    HaTypes other = (HaTypes) object;
    if ((this.hatID == null && other.hatID != null) || (this.hatID != null 
    && !this.hatID.equals(other.hatID))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "com.balay.entity.HaTypes[ hatID=" + hatID + " ]";
}

}
@Entity
@Table(name = "ha_details")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "HaDetails.findAll", query = "SELECT h FROM HaDetails h")
, @NamedQuery(name = "HaDetails.findByHadID", query = "SELECT h FROM 
 HaDetails h WHERE h.hadID = :hadID")
, @NamedQuery(name = "HaDetails.findByBusinessName", query = "SELECT h FROM 
 HaDetails h WHERE h.businessName = :businessName")
, @NamedQuery(name = "HaDetails.findByContactNum", query = "SELECT h FROM 
 HaDetails h WHERE h.contactNum = :contactNum")
, @NamedQuery(name = "HaDetails.findByBusinessAddress", query = "SELECT h 
 FROM HaDetails h WHERE h.businessAddress = :businessAddress")
, @NamedQuery(name = "HaDetails.findByStatus", query = "SELECT h FROM 
 HaDetails h WHERE h.status = :status")
, @NamedQuery(name = "HaDetails.findByRegDate", query = "SELECT h FROM 
 HaDetails h WHERE h.regDate = :regDate")
, @NamedQuery(name = "HaDetails.findByRemarks", query = "SELECT h FROM 
 HaDetails h WHERE h.remarks = :remarks")
, @NamedQuery(name = "HaDetails.findByLongitude", query = "SELECT h FROM 
 HaDetails h WHERE h.longitude = :longitude")
, @NamedQuery(name = "HaDetails.findByLatitude", query = "SELECT h FROM 
 HaDetails h WHERE h.latitude = :latitude")})
 public class HaDetails implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "hadID")
private Integer hadID;
@Basic(optional = false)
@Column(name = "businessName")
private String businessName;
@Basic(optional = false)
@Column(name = "contactNum")
private String contactNum;
@Basic(optional = false)
@Column(name = "businessAddress")
private String businessAddress;
@Basic(optional = false)
@Column(name = "status")
private String status;
@Basic(optional = false)
@Column(name = "regDate")
@Temporal(TemporalType.TIMESTAMP)
private Date regDate;
@Column(name = "remarks")
private String remarks;
@Basic(optional = false)
@Column(name = "longitude")
private String longitude;
@Basic(optional = false)
@Column(name = "latitude")
private String latitude;
@JoinColumn(name = "landlordID", referencedColumnName = "landlordID")
@ManyToOne(optional = false)
private Landlord landlordID;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hadID")
private Collection<HaImages> haImagesCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hadID")
private Collection<HaAmenities> haAmenitiesCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "hadID")
private Collection<HaTypes> haTypesCollection;
@OneToMany(mappedBy = "hadID")
private Collection<Tenant> tenantCollection;

public HaDetails() {
}

public HaDetails(Integer hadID) {
    this.hadID = hadID;
}

public HaDetails(Integer hadID, String businessName, String contactNum, String businessAddress, String status, Date regDate, String longitude, String latitude) {
    this.hadID = hadID;
    this.businessName = businessName;
    this.contactNum = contactNum;
    this.businessAddress = businessAddress;
    this.status = status;
    this.regDate = regDate;
    this.longitude = longitude;
    this.latitude = latitude;
}

public Integer getHadID() {
    return hadID;
}

public void setHadID(Integer hadID) {
    this.hadID = hadID;
}

public String getBusinessName() {
    return businessName;
}

public void setBusinessName(String businessName) {
    this.businessName = businessName;
}

public String getContactNum() {
    return contactNum;
}

public void setContactNum(String contactNum) {
    this.contactNum = contactNum;
}

public String getBusinessAddress() {
    return businessAddress;
}

public void setBusinessAddress(String businessAddress) {
    this.businessAddress = businessAddress;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public Date getRegDate() {
    return regDate;
}

public void setRegDate(Date regDate) {
    this.regDate = regDate;
}

public String getRemarks() {
    return remarks;
}

public void setRemarks(String remarks) {
    this.remarks = remarks;
}

public String getLongitude() {
    return longitude;
}

public void setLongitude(String longitude) {
    this.longitude = longitude;
}

public String getLatitude() {
    return latitude;
}

public void setLatitude(String latitude) {
    this.latitude = latitude;
}

public Landlord getLandlordID() {
    return landlordID;
}

public void setLandlordID(Landlord landlordID) {
    this.landlordID = landlordID;
}

@XmlTransient
public Collection<HaImages> getHaImagesCollection() {
    return haImagesCollection;
}

public void setHaImagesCollection(Collection<HaImages> haImagesCollection) {
    this.haImagesCollection = haImagesCollection;
}

@XmlTransient
public Collection<HaAmenities> getHaAmenitiesCollection() {
    return haAmenitiesCollection;
}

public void setHaAmenitiesCollection(Collection<HaAmenities> 
haAmenitiesCollection) {
    this.haAmenitiesCollection = haAmenitiesCollection;
}

@XmlTransient
public Collection<HaTypes> getHaTypesCollection() {
    return haTypesCollection;
}

public void setHaTypesCollection(Collection<HaTypes> haTypesCollection) {
    this.haTypesCollection = haTypesCollection;
}

@XmlTransient
public Collection<Tenant> getTenantCollection() {
    return tenantCollection;
}

public void setTenantCollection(Collection<Tenant> tenantCollection) {
    this.tenantCollection = tenantCollection;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (hadID != null ? hadID.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 HaDetails)) {
        return false;
    }
    HaDetails other = (HaDetails) object;
    if ((this.hadID == null && other.hadID != null) || (this.hadID != null 
    && !this.hadID.equals(other.hadID))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "com.balay.entity.HaDetails[ hadID=" + hadID + " ]";
}

}

0 个答案:

没有答案