I have a class named Urunler and another class named Kategoriler.
Urunler table has foreign key which is primary key of Kategoriler table.
A Kategoriler object can have multiple Urunler object.
I need to have ManyToOne mapping from Urunler class to Kategoriler class.
But I could not achieve it.
Error tells me that I have not set katid foreign key of Urunler table.
Here is my code:
#Entity
#Table(name = "urunler")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "Urunler.findAll", query = "SELECT u FROM Urunler u"),
#NamedQuery(name = "Urunler.findById", query = "SELECT u FROM Urunler u WHERE u.id = :id"),
#NamedQuery(name = "Urunler.findByAd", query = "SELECT u FROM Urunler u WHERE u.ad = :ad"),
#NamedQuery(name = "Urunler.findByAlis", query = "SELECT u FROM Urunler u WHERE u.alis = :alis"),
#NamedQuery(name = "Urunler.findBySatis", query = "SELECT u FROM Urunler u WHERE u.satis = :satis"),
#NamedQuery(name = "Urunler.findByStok", query = "SELECT u FROM Urunler u WHERE u.stok = :stok"),
#NamedQuery(name = "Urunler.findByAciklama", query = "SELECT u FROM Urunler u WHERE u.aciklama = :aciklama"),
#NamedQuery(name = "Urunler.findByKatid", query = "SELECT u FROM Urunler u WHERE u.katid = :katid")})
public class Urunler implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#ManyToOne(cascade = CascadeType.ALL)
private Kategoriler kategori;
public Kategoriler getKategori() {
return kategori;
}
public void setKategori(Kategoriler kategori) {
this.kategori = kategori;
}
#Basic(optional = false)
#Column(name = "ad")
private String ad;
#Basic(optional = false)
#Column(name = "alis")
private String alis;
#Basic(optional = false)
#Column(name = "satis")
private String satis;
#Basic(optional = false)
#Column(name = "stok")
private String stok;
#Column(name = "aciklama")
private String aciklama;
#Basic(optional = false)
#Column(name = "katid")
private Integer katid;
public Integer getKatid() {
return katid;
}
public void setKatid(Integer katid) {
this.katid = katid;
}
public Urunler() {
}
public Urunler(Integer id) {
this.id = id;
}
public Urunler(Integer id, String ad, String kategori, String alis, String satis, String stok, int katid) {
this.id = id;
this.ad = ad;
this.alis = alis;
this.satis = satis;
this.stok = stok;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public String getAlis() {
return alis;
}
public void setAlis(String alis) {
this.alis = alis;
}
public String getSatis() {
return satis;
}
public void setSatis(String satis) {
this.satis = satis;
}
public String getStok() {
return stok;
}
public void setStok(String stok) {
this.stok = stok;
}
public String getAciklama() {
return aciklama;
}
public void setAciklama(String aciklama) {
this.aciklama = aciklama;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Urunler)) {
return false;
}
Urunler other = (Urunler) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "HibClasses.Urunler[ id=" + id + " ]";
}
}
And this Kategoriler class:
#Entity
#Table(name = "kategoriler")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "Kategoriler.findAll", query = "SELECT k FROM Kategoriler k"),
#NamedQuery(name = "Kategoriler.findById", query = "SELECT k FROM Kategoriler k WHERE k.id = :id"),
#NamedQuery(name = "Kategoriler.findByAd", query = "SELECT k FROM Kategoriler k WHERE k.ad = :ad"),
#NamedQuery(name = "Kategoriler.findByAciklama", query = "SELECT k FROM Kategoriler k WHERE k.aciklama = :aciklama")})
public class Kategoriler implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Column(name = "ad")
private String ad;
#Column(name = "aciklama")
private String aciklama;
public Kategoriler() {
}
public Kategoriler(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public String getAciklama() {
return aciklama;
}
public void setAciklama(String aciklama) {
this.aciklama = aciklama;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Kategoriler)) {
return false;
}
Kategoriler other = (Kategoriler) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "HibClasses.Kategoriler[ id=" + id + " ]";
}
}
And this is where I call them:
btnDuzenle.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent ae) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Urunler urunler = new Urunler();
Kategoriler kategoriler = new Kategoriler();
kategoriler.setAd("Gıda");
kategoriler.setAciklama("Yenir la bunlar");
urunler.setAd("Bisküvi");
urunler.setAciklama("Biskrem");
urunler.setAlis("4");
urunler.setSatis("5");
urunler.setKategori(kategoriler);
urunler.setStok("4");
session.save(urunler);
session.getTransaction().commit();
}
});
I found a solution.
I have changed
...
#ManyToOne(cascade = CascadeType.ALL)
private Kategoriler kategori;
public Kategoriler getKategori() {
return kategori;
}
...
to that:
...
#ManyToOne(cascade = CascadeType.ALL)
#JoinColumn(name = "katid")
private Kategoriler kategori;
public Kategoriler getKategori() {
return kategori;
}
...
AND
...
#Column(name = "katid")
private Integer katid;
public Integer getKatid() {
return katid;
}
...
to that:
...
#Column(name = "katid", insertable = false , updatable = false)
private Integer katid;
public Integer getKatid() {
return katid;
}
...
Kategoriler should have a list of mapped by Kategoriler objects with proper anotations:
#OneToMany(mappedBy="kategoriler",cascade=CascadeType.ALL)
private List<Urunler> employees = new ArrayList<Urunler >();
Related
I can add values to the database with tables that don't have foreign key using JSON format sent through postman, however, I am receiving an error when it comes to inserting in foreign keys.
Here is my error:
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 ].
I am inserting:
{
"acceptedGender":"both",
"price":123123.00,
"type":"apartment",
"vacantNum":13,
"hadID":4
}
I used the post method below for inserting
Can someone pls help me
Here is my code:
#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 + " ]";
}
}
How do you update an entity in jpa using the put method ?
I am updating using the following JSON:
{
"acceptedGender":"both",
"price":123123.00,
"type":"apartment",
"vacantNum":13,
"hadID":4
}
I used the put method below for updating is it correct?
Can someone pls help me
Here is my code:
#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) {
em =
Persistence.createEntityManagerFactory("BalayRSPU").
createEntityManager();
try{
em.getTransaction().begin();
Admin update = em.getReference(Hatypes.class, id);
update = entity;
em.persist(update);
em.getTransaction().commit();
}finally{
em.close();
}
}
#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 + " ]";
}
}
Basically I'm implementing a PDS (Personal Data Sheet) so I have tables such as Client (employee), Personalinfo, Otherinfo.
Client table structure:
idClients, name, institute, username, password, usertype
Personalinfo table structure:
idPersonalInfo, agencyno, bloodtype, status, citizenship, address, idClients
I can add client successfully but when I'm trying to add/update personalinfo, I get
MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
In personalinfo class I have this line also:
#JoinColumn(name = "idClients", referencedColumnName = "idClients", insertable = false, updatable = false)
In Clients class I also included:
#OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Personalinfo personalinfo;
But I can't figure out why I'm getting constraint violations.
Error Code: 1452
Call: INSERT INTO personalinfo (...) VALUES (...)
bind => [7parameters bound]
Query: InsertObjectQuery(com.profiling.database.Personalinfo[ idPersonalInfo=null ])
EDIT:
if (personal != null) {
.....
personal.setClients(client);
personal.setIdPersonalInfo(client.getIdClients());
EntityManager em = emanager.getEntityManager();
em.getTransaction().begin();
em.persist(personal);
em.getTransaction().commit();
JOptionPane.showMessageDialog(rootPane, "Personal Info Updated Successfully");
} else {
personal = new Personalinfo();
....
personal.setClients(client);
client.setPersonalinfo(personal);
EntityManager em = emanager.getEntityManager();
em.getTransaction().begin();
em.persist(personal);
em.getTransaction().commit();
JOptionPane.showMessageDialog(rootPane, "New Personal Info Save");
}
EDIT
Client Class:
#Entity
#Table(name = "clients")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "Clients.findAll", query = "SELECT c FROM Clients c"),
#NamedQuery(name = "Clients.findByIdClients", query = "SELECT c FROM Clients c WHERE c.idClients = :idClients"),
#NamedQuery(name = "Clients.findByFirstName", query = "SELECT c FROM Clients c WHERE c.firstName = :firstName"),
#NamedQuery(name = "Clients.findByGender", query = "SELECT c FROM Clients c WHERE c.gender = :gender"),
#NamedQuery(name = "Clients.findByLastName", query = "SELECT c FROM Clients c WHERE c.lastName = :lastName"),
#NamedQuery(name = "Clients.findByMiddlename", query = "SELECT c FROM Clients c WHERE c.middlename = :middlename"),
#NamedQuery(name = "Clients.findByNameExtension", query = "SELECT c FROM Clients c WHERE c.nameExtension = :nameExtension")})
public class Clients implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "idClients")
private Integer idClients;
#Column(name = "FirstName")
private String firstName;
#Column(name = "Gender")
private String gender;
#Column(name = "LastName")
private String lastName;
#Column(name = "Middlename")
private String middlename;
#Column(name = "NameExtension")
private String nameExtension;
#Column(name = "Institute")
private String institute;
//value added
#Column(name = "username")
private String username;
#Column(name = "password")
private String password;
#Column(name = "userType")
private String userType;
#OneToMany(mappedBy = "idClients")
private List<Workexpe> workexpeList;
#OneToMany(mappedBy = "idClients")
private List<Ratingscore> ratingscoreList;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Familyback familyback;
#OneToMany(mappedBy = "idClients")
private List<Civilservice> civilserviceList;
#OneToMany(mappedBy = "idClients")
private List<Staffscore> staffscoreList;
#OneToMany(mappedBy = "idClients")
private List<Referenceinfo> referenceinfoList;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Personalinfo personalinfo;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
// #OneToOne(mappedBy = "idClients")
private Otherinfo otherinfo;
#OneToMany(mappedBy = "idClients")
private List<Trainingprog> trainingprogList;
#OneToMany(mappedBy = "idClients")
private List<Children> childrenList;
#OneToMany(mappedBy = "idClients")
private List<Specialskills> specialskillsList;
#OneToMany(mappedBy = "idClients")
private List<Educback> educbackList;
#OneToMany(mappedBy = "idClients")
private List<Voluntarywork> voluntaryworkList;
public Clients() {
}
public Clients(Integer idClients) {
this.idClients = idClients;
}
public Integer getIdClients() {
return idClients;
}
public void setIdClients(Integer idClients) {
this.idClients = idClients;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getMiddlename() {
return middlename;
}
public void setMiddlename(String middlename) {
this.middlename = middlename;
}
public String getNameExtension() {
return nameExtension;
}
public void setNameExtension(String nameExtension) {
this.nameExtension = nameExtension;
}
#XmlTransient
public List<Workexpe> getWorkexpeList() {
return workexpeList;
}
public void setWorkexpeList(List<Workexpe> workexpeList) {
this.workexpeList = workexpeList;
}
#XmlTransient
public List<Ratingscore> getRatingscoreList() {
return ratingscoreList;
}
public void setRatingscoreList(List<Ratingscore> ratingscoreList) {
this.ratingscoreList = ratingscoreList;
}
public Familyback getFamilyback() {
return familyback;
}
public void setFamilyback(Familyback familyback) {
this.familyback = familyback;
}
#XmlTransient
public List<Civilservice> getCivilserviceList() {
return civilserviceList;
}
public void setCivilserviceList(List<Civilservice> civilserviceList) {
this.civilserviceList = civilserviceList;
}
#XmlTransient
public List<Staffscore> getStaffscoreList() {
return staffscoreList;
}
public void setStaffscoreList(List<Staffscore> staffscoreList) {
this.staffscoreList = staffscoreList;
}
#XmlTransient
public List<Referenceinfo> getReferenceinfoList() {
return referenceinfoList;
}
public void setReferenceinfoList(List<Referenceinfo> referenceinfoList) {
this.referenceinfoList = referenceinfoList;
}
public Personalinfo getPersonalinfo() {
return personalinfo;
}
public void setPersonalinfo(Personalinfo personalinfo) {
this.personalinfo = personalinfo;
}
public Otherinfo getOtherinfo() {
return otherinfo;
}
public void setOtherinfo(Otherinfo otherinfo) {
this.otherinfo = otherinfo;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
#XmlTransient
public List<Trainingprog> getTrainingprogList() {
return trainingprogList;
}
public void setTrainingprogList(List<Trainingprog> trainingprogList) {
this.trainingprogList = trainingprogList;
}
#XmlTransient
public List<Children> getChildrenList() {
return childrenList;
}
public void setChildrenList(List<Children> childrenList) {
this.childrenList = childrenList;
}
#XmlTransient
public List<Specialskills> getSpecialskillsList() {
return specialskillsList;
}
public void setSpecialskillsList(List<Specialskills> specialskillsList) {
this.specialskillsList = specialskillsList;
}
#XmlTransient
public List<Educback> getEducbackList() {
return educbackList;
}
public void setEducbackList(List<Educback> educbackList) {
this.educbackList = educbackList;
}
#XmlTransient
public List<Voluntarywork> getVoluntaryworkList() {
return voluntaryworkList;
}
public void setVoluntaryworkList(List<Voluntarywork> voluntaryworkList) {
this.voluntaryworkList = voluntaryworkList;
}
#Override
public int hashCode() {
int hash = 0;
hash += (idClients != null ? idClients.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 Clients)) {
return false;
}
Clients other = (Clients) object;
if ((this.idClients == null && other.idClients != null) || (this.idClients != null && !this.idClients.equals(other.idClients))) {
return false;
}
return true;
}
#Override
public String toString() {
return this.lastName + ", " + this.firstName;
}
public String getInstitute() {
return institute;
}
public void setInstitute(String institute) {
this.institute = institute;
}
}
Personalinfo
#Entity
#Table(name = "personalinfo")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "Personalinfo.findAll", query = "SELECT p FROM Personalinfo p"),
#NamedQuery(name = "Personalinfo.findByIdPersonalInfo", query = "SELECT p FROM Personalinfo p WHERE p.idPersonalInfo = :idPersonalInfo"),
#NamedQuery(name = "Personalinfo.findByAgencyNumber", query = "SELECT p FROM Personalinfo p WHERE p.agencyNumber = :agencyNumber"),
#NamedQuery(name = "Personalinfo.findByBloodType", query = "SELECT p FROM Personalinfo p WHERE p.bloodType = :bloodType"),
#NamedQuery(name = "Personalinfo.findByCellphone", query = "SELECT p FROM Personalinfo p WHERE p.cellphone = :cellphone"),
#NamedQuery(name = "Personalinfo.findByCevilStatus", query = "SELECT p FROM Personalinfo p WHERE p.cevilStatus = :cevilStatus"),
#NamedQuery(name = "Personalinfo.findByCitizenship", query = "SELECT p FROM Personalinfo p WHERE p.citizenship = :citizenship"),
#NamedQuery(name = "Personalinfo.findByDateofBirth", query = "SELECT p FROM Personalinfo p WHERE p.dateofBirth = :dateofBirth"),
#NamedQuery(name = "Personalinfo.findByEmailAdd", query = "SELECT p FROM Personalinfo p WHERE p.emailAdd = :emailAdd"),
#NamedQuery(name = "Personalinfo.findByGsis", query = "SELECT p FROM Personalinfo p WHERE p.gsis = :gsis"),
#NamedQuery(name = "Personalinfo.findByHeight", query = "SELECT p FROM Personalinfo p WHERE p.height = :height"),
#NamedQuery(name = "Personalinfo.findByPagibig", query = "SELECT p FROM Personalinfo p WHERE p.pagibig = :pagibig"),
#NamedQuery(name = "Personalinfo.findByPermanentAddress", query = "SELECT p FROM Personalinfo p WHERE p.permanentAddress = :permanentAddress"),
#NamedQuery(name = "Personalinfo.findByPhilHealth", query = "SELECT p FROM Personalinfo p WHERE p.philHealth = :philHealth"),
#NamedQuery(name = "Personalinfo.findByPlaceofBirth", query = "SELECT p FROM Personalinfo p WHERE p.placeofBirth = :placeofBirth"),
#NamedQuery(name = "Personalinfo.findByResidentialAddress", query = "SELECT p FROM Personalinfo p WHERE p.residentialAddress = :residentialAddress"),
#NamedQuery(name = "Personalinfo.findBySssNo", query = "SELECT p FROM Personalinfo p WHERE p.sssNo = :sssNo"),
#NamedQuery(name = "Personalinfo.findByTelephone1", query = "SELECT p FROM Personalinfo p WHERE p.telephone1 = :telephone1"),
#NamedQuery(name = "Personalinfo.findByTelephone2", query = "SELECT p FROM Personalinfo p WHERE p.telephone2 = :telephone2"),
#NamedQuery(name = "Personalinfo.findByTin", query = "SELECT p FROM Personalinfo p WHERE p.tin = :tin"),
#NamedQuery(name = "Personalinfo.findByWeight", query = "SELECT p FROM Personalinfo p WHERE p.weight = :weight"),
#NamedQuery(name = "Personalinfo.findByZipcode1", query = "SELECT p FROM Personalinfo p WHERE p.zipcode1 = :zipcode1"),
#NamedQuery(name = "Personalinfo.findByZipcode2", query = "SELECT p FROM Personalinfo p WHERE p.zipcode2 = :zipcode2")})
public class Personalinfo implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "idPersonalInfo")
private Integer idPersonalInfo;
#Column(name = "AgencyNumber")
private String agencyNumber;
#Column(name = "BloodType")
private String bloodType;
#Column(name = "Cellphone")
private String cellphone;
#Column(name = "CevilStatus")
private String cevilStatus;
#Column(name = "Citizenship")
private String citizenship;
#Column(name = "DateofBirth")
#Temporal(TemporalType.TIMESTAMP)
private Date dateofBirth;
#Column(name = "EmailAdd")
private String emailAdd;
#Column(name = "GSIS")
private String gsis;
#Column(name = "Height")
private String height;
#Column(name = "Pagibig")
private String pagibig;
#Column(name = "PermanentAddress")
private String permanentAddress;
#Column(name = "PhilHealth")
private String philHealth;
#Lob
#Column(name = "Picture")
private byte[] picture;
#Column(name = "PlaceofBirth")
private String placeofBirth;
#Column(name = "ResidentialAddress")
private String residentialAddress;
#Column(name = "SssNo")
private String sssNo;
#Column(name = "Telephone1")
private String telephone1;
#Column(name = "Telephone2")
private String telephone2;
#Column(name = "Tin")
private String tin;
#Column(name = "Weight")
private String weight;
#Column(name = "Zipcode1")
private String zipcode1;
#Column(name = "Zipcode2")
private String zipcode2;
#Column(name = "IdClients")
private String idClients;
#JoinColumn(name = "idClients", referencedColumnName = "idClients", insertable = false, updatable = false)
// #JoinColumn(name = "idClients", referencedColumnName = "idClients")
#OneToOne(optional = false)
private Clients clients;
public Personalinfo() {
}
public Personalinfo(Integer idPersonalInfo) {
this.idPersonalInfo = idPersonalInfo;
}
public Integer getIdPersonalInfo() {
return idPersonalInfo;
}
public void setIdPersonalInfo(Integer idPersonalInfo) {
this.idPersonalInfo = idPersonalInfo;
}
public String getAgencyNumber() {
return agencyNumber;
}
public void setAgencyNumber(String agencyNumber) {
this.agencyNumber = agencyNumber;
}
public String getBloodType() {
return bloodType;
}
public void setBloodType(String bloodType) {
this.bloodType = bloodType;
}
public String getCellphone() {
return cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public String getCevilStatus() {
return cevilStatus;
}
public void setCevilStatus(String cevilStatus) {
this.cevilStatus = cevilStatus;
}
public String getCitizenship() {
return citizenship;
}
public void setCitizenship(String citizenship) {
this.citizenship = citizenship;
}
public Date getDateofBirth() {
return dateofBirth;
}
public void setDateofBirth(Date dateofBirth) {
this.dateofBirth = dateofBirth;
}
public String getEmailAdd() {
return emailAdd;
}
public void setEmailAdd(String emailAdd) {
this.emailAdd = emailAdd;
}
public String getGsis() {
return gsis;
}
public void setGsis(String gsis) {
this.gsis = gsis;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getPagibig() {
return pagibig;
}
public void setPagibig(String pagibig) {
this.pagibig = pagibig;
}
public String getPermanentAddress() {
return permanentAddress;
}
public void setPermanentAddress(String permanentAddress) {
this.permanentAddress = permanentAddress;
}
public String getPhilHealth() {
return philHealth;
}
public void setPhilHealth(String philHealth) {
this.philHealth = philHealth;
}
public byte[] getPicture() {
return picture;
}
public void setPicture(byte[] picture) {
this.picture = picture;
}
public String getPlaceofBirth() {
return placeofBirth;
}
public void setPlaceofBirth(String placeofBirth) {
this.placeofBirth = placeofBirth;
}
public String getResidentialAddress() {
return residentialAddress;
}
public void setResidentialAddress(String residentialAddress) {
this.residentialAddress = residentialAddress;
}
public String getSssNo() {
return sssNo;
}
public void setSssNo(String sssNo) {
this.sssNo = sssNo;
}
public String getTelephone1() {
return telephone1;
}
public void setTelephone1(String telephone1) {
this.telephone1 = telephone1;
}
public String getTelephone2() {
return telephone2;
}
public void setTelephone2(String telephone2) {
this.telephone2 = telephone2;
}
public String getTin() {
return tin;
}
public void setTin(String tin) {
this.tin = tin;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getZipcode1() {
return zipcode1;
}
public void setZipcode1(String zipcode1) {
this.zipcode1 = zipcode1;
}
public String getZipcode2() {
return zipcode2;
}
public void setZipcode2(String zipcode2) {
this.zipcode2 = zipcode2;
}
#MapsId
public Clients getClients() {
return clients;
}
#MapsId
public void setClients(Clients clients) {
this.clients = clients;
}
public String getIdClient() {
return idClients;
}
public void setIdClients(String clients) {
this.idClients = clients;
}
#Override
public int hashCode() {
int hash = 0;
hash += (idPersonalInfo != null ? idPersonalInfo.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 Personalinfo)) {
return false;
}
Personalinfo other = (Personalinfo) object;
if ((this.idPersonalInfo == null && other.idPersonalInfo != null) || (this.idPersonalInfo != null && !this.idPersonalInfo.equals(other.idPersonalInfo))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.doscst.profiling.database.Personalinfo[ idPersonalInfo=" + idPersonalInfo + " ]";
}
}
Suppose you try with this in PersonalInfo class and check.
#OneToOne
#JoinColumn(name = "idClients")
private Clients clients;
Been messing around with Hibernate and PostgreSQL trying to get it to work as expected.
But for some reason when I try to persist an object with a #OneToMany relationship with more than one item in the set all but the first item seem to be ignored. I've tried this via local and remote interfaces but get the same results each time. No exceptions are thrown, it looks like hibernate just stops persisting after the first unit has been persisted.
Any help much appreciated this one has been eluding me for days now.
I'm using Hibernate 3.5 and PostgreSQL 8.4.4 with Glassfish v3. All the annotations in the source are from the package javax.persistence - had to remove imports because of the character limit.
The FacadeManager is simply a utility to take the hassle out of jndi lookups, it simplifies accessing remote facades.
Here is the test method
#Test
public void testOneToManyCascade() throws Exception {
/*
* Set up entities requred to perform the test
*/
UnitFacadeRemote unitfr = FacadeManager
.getFacade(UnitFacadeRemote.class);
UserFacadeRemote userfr = FacadeManager
.getFacade(UserFacadeRemote.class);
User user = new User("P", "P", "000000", true, new Date(), "ypy#ypy",
"wordof mout", "slacker", "password");
Address address = new Address("yo", "go", "YOKO", "4123");
address.setCountry(FacadeManager.getFacade(CountryFacadeRemote.class)
.find(2));
user.setAddress(address);
Unit unit1 = new Unit(1, "Test Unit1", new Date(), "DisService",
"MyNation");
Unit unit2 = new Unit(2, "Test Unit2", new Date(), "DisService",
"TheirNation");
Unit unit3 = new Unit(3, "Test Unit3", new Date(), "DisService",
"TheirNation");
// Check no game exists
assertThat(FacadeManager.getFacade(GameFacadeRemote.class).findAll()
.size(), is(0));
Game game = new Game("blabla", 3333, "A game!", true);
// Create game and return reference to persisted game instance
game = FacadeManager.getFacade(GameFacadeRemote.class).registerGame(
game);
unit1.setGame(game);
unit2.setGame(game);
unit3.setGame(game);
// Find a virtue
Virtue v = FacadeManager.getFacade(VirtueFacadeRemote.class).find(1);
unit1.setVirtue(v);
unit2.setVirtue(v);
unit3.setVirtue(v);
// check that none of the above exist already
assertThat(userfr.findAll().size(), is(0));
assertThat(unitfr.findAll().size(), is(0));
/*
* Try persisting the by cascading from the user
*/
Set<Unit> unitSet = new HashSet<Unit>();
unitSet.add(unit2);
unitSet.add(unit1);
unitSet.add(unit3);
user.setUnitSet(unitSet);
unit1.setUser(user);
unit2.setUser(user);
unit3.setUser(user);
// Persist
userfr.create(user);
/*
* The result of the preceding persist is that the game, user, address
* and one unit are persisted, in this case unit2 but it seems whichever
* unit is first added to unitSet is the one that is persisted.
*/
}
Here follow the various entity classes
package com.game.database.entity;
#Entity
#Table(name = "address")
#NamedQueries({
#NamedQuery(name = "Address.findAll", query = "SELECT a FROM Address a"),
#NamedQuery(name = "Address.findById", query = "SELECT a FROM Address a WHERE a.id = :id"),
#NamedQuery(name = "Address.findByLine1", query = "SELECT a FROM Address a WHERE a.line1 = :line1"),
#NamedQuery(name = "Address.findByLine2", query = "SELECT a FROM Address a WHERE a.line2 = :line2"),
#NamedQuery(name = "Address.findByCity", query = "SELECT a FROM Address a WHERE a.city = :city"),
#NamedQuery(name = "Address.findByAreaCode", query = "SELECT a FROM Address a WHERE a.areaCode = :areaCode") })
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
#SequenceGenerator(name = "address_id_seq", sequenceName = "address_id_seq", allocationSize = 1)
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "address_id_seq")
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#Column(name = "line1")
private String line1;
#Basic(optional = false)
#Column(name = "line2")
private String line2;
#Basic(optional = false)
#Column(name = "city")
private String city;
#Basic(optional = false)
#Column(name = "areaCode")
private String areaCode;
#JoinColumn(name = "country", referencedColumnName = "id")
#ManyToOne(optional = false)
private Country country;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "address")
private Set<User> userSet;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "address")
private Set<CardDetails> cardDetailsSet;
public Address() {
}
public Address(Integer id) {
this.id = id;
}
public Address(String line1, String line2, String city, String areaCode) {
this.line1 = line1;
this.line2 = line2;
this.city = city;
this.areaCode = areaCode;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLine1() {
return line1;
}
public void setLine1(String line1) {
this.line1 = line1;
}
public String getLine2() {
return line2;
}
public void setLine2(String line2) {
this.line2 = line2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
public Set<User> getUserSet() {
return userSet;
}
public void setUserSet(Set<User> userSet) {
this.userSet = userSet;
}
public Set<CardDetails> getCardDetailsSet() {
return cardDetailsSet;
}
public void setCardDetailsSet(Set<CardDetails> cardDetailsSet) {
this.cardDetailsSet = cardDetailsSet;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Address)) {
return false;
}
Address other = (Address) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.Address[id=" + id + "]";
}
}
--
package com.game.database.entity;
#Entity
#Table(name = "game")
#NamedQueries({
#NamedQuery(name = "Game.findAll", query = "SELECT g FROM Game g"),
#NamedQuery(name = "Game.findById", query = "SELECT g FROM Game g WHERE g.id = :id"),
#NamedQuery(name = "Game.findByHost", query = "SELECT g FROM Game g WHERE g.host = :host"),
#NamedQuery(name = "Game.findByPort", query = "SELECT g FROM Game g WHERE g.port = :port"),
#NamedQuery(name = "Game.findByDescription", query = "SELECT g FROM Game g WHERE g.description = :description"),
#NamedQuery(name = "Game.findByActive", query = "SELECT g FROM Game g WHERE g.active = :active"),
#NamedQuery(name = "Game.findByHostAndPort", query = "SELECT g FROM Game g WHERE g.host = :host AND g.port = :port") })
public class Game implements Serializable {
private static final long serialVersionUID = 1L;
#SequenceGenerator(name = "game_id_seq", sequenceName = "game_id_seq", allocationSize = 1)
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "game_id_seq")
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#Column(name = "host")
private String host;
#Basic(optional = false)
#Column(name = "port")
private int port;
#Basic(optional = false)
#Column(name = "description")
private String description;
#Basic(optional = false)
#Column(name = "active")
private Boolean active;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "game")
private Set<Unit> unitSet;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "game")
private Set<Payment> paymentSet;
public Game() {
}
public Game(Integer id) {
this.id = id;
}
public Game(String host, int port, String description, Boolean active) {
this.host = host;
this.port = port;
this.description = description;
this.active = active;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
public Set<Unit> getUnitSet() {
return unitSet;
}
public void setUnitSet(Set<Unit> unitSet) {
this.unitSet = unitSet;
}
public Set<Payment> getPaymentSet() {
return paymentSet;
}
public void setPaymentSet(Set<Payment> paymentSet) {
this.paymentSet = paymentSet;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Game)) {
return false;
}
Game other = (Game) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.Game[id=" + id + "]";
}
}
--
package com.game.database.entity;
#Entity
#Table(name = "unit")
#NamedQueries({
#NamedQuery(name = "Unit.findAll", query = "SELECT u FROM Unit u"),
#NamedQuery(name = "Unit.findById", query = "SELECT u FROM Unit u WHERE u.id = :id"),
#NamedQuery(name = "Unit.findByUnitId", query = "SELECT u FROM Unit u WHERE u.unitId = :unitId"),
#NamedQuery(name = "Unit.findByName", query = "SELECT u FROM Unit u WHERE u.name = :name"),
#NamedQuery(name = "Unit.findByRegistrationDate", query = "SELECT u FROM Unit u WHERE u.registrationDate = :registrationDate"),
#NamedQuery(name = "Unit.findByService", query = "SELECT u FROM Unit u WHERE u.service = :service"),
#NamedQuery(name = "Unit.findByNation", query = "SELECT u FROM Unit u WHERE u.nation = :nation") })
public class Unit implements Serializable {
private static final long serialVersionUID = 1L;
#SequenceGenerator(name = "unit_id_seq", sequenceName = "unit_id_seq", allocationSize = 1)
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "unit_id_seq")
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#Column(name = "unitId")
private Integer unitId;
#Basic(optional = false)
#Column(name = "name")
private String name;
#Basic(optional = false)
#Column(name = "registrationDate")
#Temporal(TemporalType.TIMESTAMP)
private Date registrationDate;
#Basic(optional = false)
#Column(name = "service")
private String service;
#Basic(optional = false)
#Column(name = "nation")
private String nation;
#JoinColumn(name = "virtue", referencedColumnName = "id")
#ManyToOne(optional = false)
private Virtue virtue;
#JoinColumn(name = "customer", referencedColumnName = "id")
#ManyToOne(optional = false)
private User customer;
#JoinColumn(name = "game", referencedColumnName = "id")
#ManyToOne(optional = false)
private Game game;
public Unit() {
}
public Unit(Integer id) {
this.id = id;
}
public Unit(Integer unitId, String name, Date registrationDate,
String service, String nation) {
this.unitId = unitId;
this.name = name;
this.registrationDate = registrationDate;
this.service = service;
this.nation = nation;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUnitId() {
return unitId;
}
public void setUnitId(Integer unitId) {
this.unitId = unitId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public Virtue getVirtue() {
return virtue;
}
public void setVirtue(Virtue virtue) {
this.virtue = virtue;
}
public User getUser() {
return customer;
}
public void setUser(User user) {
this.customer = user;
}
public Game getGame() {
return game;
}
public void setGame(Game game) {
Logger.getLogger("org.hibernate").setLevel(Level.FINEST);
this.game = game;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Unit)) {
return false;
}
Unit other = (Unit) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.Unit[id=" + id + "]";
}
#Transient
private String command;
/**
* Get the value of command
*
* #return the value of command
*/
public String getCommand() {
return command;
}
/**
* Set the value of command
*
* #param command
* new value of command
*/
public void setCommand(String command) {
this.command = command;
}
#Transient
private String rank;
/**
* Get the value of rank
*
* #return the value of rank
*/
public String getRank() {
return rank;
}
/**
* Set the value of rank
*
* #param rank
* new value of rank
*/
public void setRank(String rank) {
this.rank = rank;
}
#Transient
private BigDecimal price;
/**
* Get the value of price
*
* #return the value of price
*/
public BigDecimal getPrice() {
return price;
}
/**
* Set the value of price
*
* #param price
* new value of price
*/
public void setPrice(BigDecimal price) {
this.price = price;
}
}
--
package com.game.database.entity;
#Entity
#Table(name = "customer")
#NamedQueries({
#NamedQuery(name = "User.findAll", query = "SELECT u FROM User u"),
#NamedQuery(name = "User.findById", query = "SELECT u FROM User u WHERE u.id = :id"),
#NamedQuery(name = "User.findByGivenName", query = "SELECT u FROM User u WHERE u.givenName = :givenName"),
#NamedQuery(name = "User.findBySurname", query = "SELECT u FROM User u WHERE u.surname = :surname"),
#NamedQuery(name = "User.findByPhoneNumber", query = "SELECT u FROM User u WHERE u.phoneNumber = :phoneNumber"),
#NamedQuery(name = "User.findBySex", query = "SELECT u FROM User u WHERE u.sex = :sex"),
#NamedQuery(name = "User.findByBirthYear", query = "SELECT u FROM User u WHERE u.birthYear = :birthYear"),
#NamedQuery(name = "User.findByEmail", query = "SELECT u FROM User u WHERE u.email = :email"),
#NamedQuery(name = "User.findByInfoSource", query = "SELECT u FROM User u WHERE u.infoSource = :infoSource"),
#NamedQuery(name = "User.findByOccupation", query = "SELECT u FROM User u WHERE u.occupation = :occupation"),
#NamedQuery(name = "User.findByPassword", query = "SELECT u FROM User u WHERE u.password = :password"),
#NamedQuery(name = "User.findByEmailAndPassword", query = "SELECT u FROM User u WHERE u.password = :password AND u.email = :email") })
public class User implements Serializable {
private static final long serialVersionUID = 1L;
#SequenceGenerator(name = "user_id_seq", sequenceName = "user_id_seq", allocationSize = 1)
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq")
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#Column(name = "givenName")
private String givenName;
#Basic(optional = false)
#Column(name = "surname")
private String surname;
#Basic(optional = false)
#Column(name = "phoneNumber")
private String phoneNumber;
#Basic(optional = false)
#Column(name = "sex")
private boolean sex;
#Basic(optional = false)
#Column(name = "birthYear")
#Temporal(TemporalType.DATE)
private Date birthYear;
#Basic(optional = false)
#Column(name = "email")
private String email;
#Basic(optional = false)
#Column(name = "infoSource")
private String infoSource;
#Basic(optional = false)
#Column(name = "occupation")
private String occupation;
#Basic(optional = false)
#Column(name = "password")
private String password;
/**
* The EAGER fetch type ensures that when we get access a unit remotely it
* has had its unit set initialised and populated
*/
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", fetch = FetchType.EAGER)
private Set<Unit> unitSet;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", fetch = FetchType.EAGER)
private Set<Payment> paymentSet;
#JoinColumn(name = "address", referencedColumnName = "id")
#ManyToOne(cascade = CascadeType.ALL, optional = false)
private Address address;
public User() {
}
public User(Integer id) {
this.id = id;
}
public User(String givenName, String surname, String phoneNumber,
boolean sex, Date birthYear, String email, String infoSource,
String occupation, String password) {
this.givenName = givenName;
this.surname = surname;
this.phoneNumber = phoneNumber;
this.sex = sex;
this.birthYear = birthYear;
this.email = email;
this.infoSource = infoSource;
this.occupation = occupation;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGivenName() {
return givenName;
}
public void setGivenName(String givenName) {
this.givenName = givenName;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public boolean getSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public Date getBirthYear() {
return birthYear;
}
public void setBirthYear(Date birthYear) {
this.birthYear = birthYear;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getInfoSource() {
return infoSource;
}
public void setInfoSource(String infoSource) {
this.infoSource = infoSource;
}
public String getOccupation() {
return occupation;
}
public void setOccupation(String occupation) {
this.occupation = occupation;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Unit> getUnitSet() {
return unitSet;
}
public void setUnitSet(Set<Unit> unitSet) {
this.unitSet = unitSet;
}
public Set<Payment> getPaymentSet() {
return paymentSet;
}
public void setPaymentSet(Set<Payment> paymentSet) {
this.paymentSet = paymentSet;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 User)) {
return false;
}
User other = (User) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.User[id=" + id + "]";
}
}
--
package com.game.database.entity;
#Entity
#Table(name = "virtue")
#NamedQueries({
#NamedQuery(name = "Virtue.findAll", query = "SELECT v FROM Virtue v"),
#NamedQuery(name = "Virtue.findById", query = "SELECT v FROM Virtue v WHERE v.id = :id"),
#NamedQuery(name = "Virtue.findByName", query = "SELECT v FROM Virtue v WHERE v.name = :name"),
#NamedQuery(name = "Virtue.findByDescription", query = "SELECT v FROM Virtue v WHERE v.description = :description") })
public class Virtue implements Serializable {
private static final long serialVersionUID = 1L;
#SequenceGenerator(name = "virtue_id_seq", sequenceName = "virtue_id_seq", allocationSize = 1)
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "virtue_id_seq")
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Basic(optional = false)
#Column(name = "name")
private String name;
#Basic(optional = false)
#Column(name = "description")
private String description;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "virtue")
private Set<Unit> unitSet;
public Virtue() {
}
public Virtue(Integer id) {
this.id = id;
}
public Virtue(String name, String description) {
this.name = name;
this.description = description;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Set<Unit> getUnitSet() {
return unitSet;
}
public void setUnitSet(Set<Unit> unitSet) {
this.unitSet = unitSet;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Virtue)) {
return false;
}
Virtue other = (Virtue) object;
if ((this.id == null && other.id != null)
|| (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.Virtue[id=" + id + "]";
}
}
You have a problem with the identity of the Unit objects. You're using in your code a HashSet which relies on equals and hashCode methods which are overridden in your code.
If you run the main method in the code below, you will see that after adding the Unit objects there is only one of them in the set (I reused your original code but I simplified it a bit):
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class Unit {
private Integer id;
private Integer unitId;
private String name;
private Date registrationDate;
private String service;
private String nation;
public Unit() {
}
public Unit(Integer id) {
this.id = id;
}
public Unit(Integer unitId, String name, Date registrationDate, String service, String nation) {
this.unitId = unitId;
this.name = name;
this.registrationDate = registrationDate;
this.service = service;
this.nation = nation;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUnitId() {
return unitId;
}
public void setUnitId(Integer unitId) {
this.unitId = unitId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
#Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.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 Unit)) {
return false;
}
Unit other = (Unit) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
#Override
public String toString() {
return "com.game.database.entity.Unit[id=" + id + "]";
}
public static void main(String... args) {
Unit unit1 = new Unit(1, "Test Unit1", new Date(), "DisService", "MyNation");
Unit unit2 = new Unit(2, "Test Unit2", new Date(), "DisService", "TheirNation");
Unit unit3 = new Unit(3, "Test Unit3", new Date(), "DisService", "TheirNation");
Set unitSet = new HashSet();
unitSet.add(unit2);
unitSet.add(unit1);
unitSet.add(unit3);
System.out.println(unitSet.size());
}
If you comment out the equals() and hashCode() and run the code again you will see three objects in the set.
Your equals() method is based on the id property which is set by hibernate at time the object is being persisted and not at the time of adding to the set. It means that the Unit has always a null id and hashCode = 0 when added to the set. I recommend reading this article: http://community.jboss.org/wiki/EqualsandHashCode
Hope it helps!
im new to JPA, i got the error above when trying to persist the transaction data.
Here's my Entity:
#Entity
#Table(name = "transaction1")
#NamedQueries({
#NamedQuery(name = "Transaction1.findAll", query = "SELECT t FROM Transaction1 t"),
#NamedQuery(name = "Transaction1.findByTransactionID", query = "SELECT t FROM Transaction1 t WHERE t.transactionID = :transactionID"),
#NamedQuery(name = "Transaction1.findByAmount", query = "SELECT t FROM Transaction1 t WHERE t.amount = :amount"),
#NamedQuery(name = "Transaction1.findByFromAccNo", query = "SELECT t FROM Transaction1 t WHERE t.fromAccNo = :fromAccNo"),
#NamedQuery(name = "Transaction1.findByFromSortCodeNo", query = "SELECT t FROM Transaction1 t WHERE t.fromSortCodeNo = :fromSortCodeNo"),
#NamedQuery(name = "Transaction1.findByName", query = "SELECT t FROM Transaction1 t WHERE t.name = :name"),
#NamedQuery(name = "Transaction1.findByToAccNo", query = "SELECT t FROM Transaction1 t WHERE t.toAccNo = :toAccNo"),
#NamedQuery(name = "Transaction1.findByToSortCodeNo", query = "SELECT t FROM Transaction1 t WHERE t.toSortCodeNo = :toSortCodeNo"),
#NamedQuery(name = "Transaction1.findByTransactionDate", query = "SELECT t FROM Transaction1 t WHERE t.transactionDate = :transactionDate")})
public class Transaction1 implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "Transaction_ID")
private Integer transactionID;
#Basic(optional = false)
#Column(name = "Amount")
private double amount;
#Basic(optional = false)
#Column(name = "From_Acc_No")
private int fromAccNo;
#Basic(optional = false)
#Column(name = "From_Sort_Code_No")
private String fromSortCodeNo;
#Basic(optional = false)
#Column(name = "Name")
private String name;
#Basic(optional = false)
#Column(name = "To_Acc_No")
private int toAccNo;
#Basic(optional = false)
#Column(name = "To_Sort_Code_No")
private String toSortCodeNo;
#Basic(optional = false)
#Column(name = "Transaction_Date")
#Temporal(TemporalType.TIMESTAMP)
private Date transactionDate;
static EntityManagerFactory emf = Persistence.createEntityManagerFactory("SWSXXPU");
public Transaction1() {
}
public Transaction1(Integer transactionID) {
this.transactionID = transactionID;
}
public Transaction1(Integer transactionID, double amount, int fromAccNo, String fromSortCodeNo, String name, int toAccNo, String toSortCodeNo, Date transactionDate) {
this.transactionID = transactionID;
this.amount = amount;
this.fromAccNo = fromAccNo;
this.fromSortCodeNo = fromSortCodeNo;
this.name = name;
this.toAccNo = toAccNo;
this.toSortCodeNo = toSortCodeNo;
this.transactionDate = transactionDate;
}
public Integer getTransactionID() {
return transactionID;
}
public void setTransactionID(Integer transactionID) {
this.transactionID = transactionID;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public int getFromAccNo() {
return fromAccNo;
}
public void setFromAccNo(int fromAccNo) {
this.fromAccNo = fromAccNo;
}
public String getFromSortCodeNo() {
return fromSortCodeNo;
}
public void setFromSortCodeNo(String fromSortCodeNo) {
this.fromSortCodeNo = fromSortCodeNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getToAccNo() {
return toAccNo;
}
public void setToAccNo(int toAccNo) {
this.toAccNo = toAccNo;
}
public String getToSortCodeNo() {
return toSortCodeNo;
}
public void setToSortCodeNo(String toSortCodeNo) {
this.toSortCodeNo = toSortCodeNo;
}
public Date getTransactionDate() {
return transactionDate;
}
public void setTransactionDate(Date transactionDate) {
this.transactionDate = transactionDate;
}
#Override
public int hashCode() {
int hash = 0;
hash += (transactionID != null ? transactionID.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 Transaction1)) {
return false;
}
Transaction1 other = (Transaction1) object;
if ((this.transactionID == null && other.transactionID != null) || (this.transactionID != null && !this.transactionID.equals(other.transactionID))) {
return false;
}
return true;
}
#Override
public String toString() {
return "Entities.Transaction1[transactionID=" + transactionID + "]";
}
Here's my servlet:
try{
Transaction1 t = new Transaction1();
t.setFromAccNo(youraccinput);
t.setFromSortCodeNo(yoursortcodeinput);
t.setToAccNo(toaccinput);
t.setToSortCodeNo(destsortcodeinput);
t.setName(recname);
t.setAmount(amtsender);
EntityManager em;
EntityManagerFactory emf;
try {
emf = Persistence.createEntityManagerFactory("SWSXXPU");
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(t);
em.getTransaction().commit();
request.getRequestDispatcher("ListTransaction").forward(request, response);
}
catch(Throwable e){
out.print(e.getMessage());
out.print(e.getCause());
}
Accounts.debitSourceAccBalance(youraccinput, toaccinput, recname, amtsender);
}
catch(Throwable e){
out.print(e.getMessage());
out.print(e.getCause());
}
Full error message:
org.hibernate.PropertyValueException:
not-null property references a null or
transient value:
Entities.Transaction1.transactionDateorg.hibernate.PropertyValueException:
not-null property references a null or
transient value:
Entities.Transaction1.transactionDate
I debugged it and it seemed like there is a value property of not null is null, which i dont seem to understand this error message. I thought I dont need to persist transactionID, as it is set to autoincrement, and transactionDate to timestamp oncurrentupdate. Can anyone please kindly help to fix?
The transactionDate field has been marked with #Basic(optional = false). Ensure that the value for this field is not null while persisting the Transaction.
If the transactionData can be genuinely null (I guess not), you can remove the optional option from #Basic.