简体   繁体   中英

How to Create One to many and many to many relationship on same bean class using spring with hibernate template

Our First Entity Bean Class.

@Entity
@Table(name = "visamanagmenttable")
@DynamicUpdate 
@SelectBeforeUpdate(true)
public class VisaManagementBean {

    @Id
    @Column(name = "visaManageId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int visaManageId;

    @Column(name = "countryName")
    private String countryName;

    @Column(name = "visaUniqueId")
    private String visaUniqueId;

    @Column(name = "visaCategory")
    private int visaCategory;

    @Column(name = "visaVarientName")
    private String visaVarientName;

    @Column(name = "visaGovernmentFee")
    private String visaGovernmentFee;

    @Column(name = "visaServiceFee")
    private String visaServiceFee;

    @Column(name = "visaSecurityDepositFee")
    private String visaSecurityDepositFee;

    @Column(name = "visaAdditionalFee")
    private String visaAdditionalFee;

    @Column(name = "visaAdditionalRemark")
    private String visaAdditionalRemark;

    @Column(name = "visaSecurityDepositRemark")
    private String visaSecurityDepositRemark;

    @Column(name = "visaMode")
    private String visaMode;

    @Column(name = "visaCitizenShipCountry")
    private String visaCitizenShipCountry;

    @Column(name = "visaLivingCountry")
    private String visaLivingCountry;

    @Column(name = "visaDescription")
    private String visaDescription;

    @Column(name = "visaStatus")
    private String visaStatus;

    @Column(name="createdBy", updatable=false)
    private String createdBy;

    @Column(name="modifiedBy")
    private String modifiedBy;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creationDate",updatable=false)
    private Date creationDate;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="modifiedDate")
    private Date modifiedDate;

    @Column(name = "status")
    private String status;  

    @Transient
    private String[] citizencountry;

    @Transient
    private String[] livingcountry;

    public int getVisaManageId() {
        return visaManageId;
    }

    public String getVisaUniqueId() {
        return visaUniqueId;
    }

    public int getVisaCategory() {
        return visaCategory;
    }

    public String getVisaVarientName() {
        return visaVarientName;
    }

    public String getVisaGovernmentFee() {
        return visaGovernmentFee;
    }

    public String getVisaServiceFee() {
        return visaServiceFee;
    }

    public String getVisaSecurityDepositFee() {
        return visaSecurityDepositFee;
    }

    public String getVisaAdditionalFee() {
        return visaAdditionalFee;
    }

    public String getVisaAdditionalRemark() {
        return visaAdditionalRemark;
    }

    public String getVisaSecurityDepositRemark() {
        return visaSecurityDepositRemark;
    }

    public String getVisaMode() {
        return visaMode;
    }

    public String getVisaCitizenShipCountry() {
        return visaCitizenShipCountry;
    }

    public String getVisaLivingCountry() {
        return visaLivingCountry;
    }

    public String getVisaDescription() {
        return visaDescription;
    }

    public String getVisaStatus() {
        return visaStatus;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public String getModifiedBy() {
        return modifiedBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public Date getModifiedDate() {
        return modifiedDate;
    }

    public String getStatus() {
        return status;
    }

    public void setVisaManageId(int visaManageId) {
        this.visaManageId = visaManageId;
    }

    public void setVisaUniqueId(String visaUniqueId) {
        this.visaUniqueId = visaUniqueId;
    }

    public void setVisaCategory(int visaCategory) {
        this.visaCategory = visaCategory;
    }

    public void setVisaVarientName(String visaVarientName) {
        this.visaVarientName = visaVarientName;
    }

    public void setVisaGovernmentFee(String visaGovernmentFee) {
        this.visaGovernmentFee = visaGovernmentFee;
    }

    public void setVisaServiceFee(String visaServiceFee) {
        this.visaServiceFee = visaServiceFee;
    }

    public void setVisaSecurityDepositFee(String visaSecurityDepositFee) {
        this.visaSecurityDepositFee = visaSecurityDepositFee;
    }

    public void setVisaAdditionalFee(String visaAdditionalFee) {
        this.visaAdditionalFee = visaAdditionalFee;
    }

    public void setVisaAdditionalRemark(String visaAdditionalRemark) {
        this.visaAdditionalRemark = visaAdditionalRemark;
    }

    public void setVisaSecurityDepositRemark(String visaSecurityDepositRemark) {
        this.visaSecurityDepositRemark = visaSecurityDepositRemark;
    }

    public void setVisaMode(String visaMode) {
        this.visaMode = visaMode;
    }

    public void setVisaCitizenShipCountry(String visaCitizenShipCountry) {
        this.visaCitizenShipCountry = visaCitizenShipCountry;
    }

    public void setVisaLivingCountry(String visaLivingCountry) {
        this.visaLivingCountry = visaLivingCountry;
    }

    public void setVisaDescription(String visaDescription) {
        this.visaDescription = visaDescription;
    }

    public void setVisaStatus(String visaStatus) {
        this.visaStatus = visaStatus;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public void setModifiedBy(String modifiedBy) {
        this.modifiedBy = modifiedBy;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public void setModifiedDate(Date modifiedDate) {
        this.modifiedDate = modifiedDate;
    }

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

    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

    public String[] getCitizencountry() {
        return citizencountry;
    }

    public String[] getLivingcountry() {
        return livingcountry;
    }

    public void setCitizencountry(String[] citizencountry) {
        this.citizencountry = citizencountry;
    }

    public void setLivingcountry(String[] livingcountry) {
        this.livingcountry = livingcountry;
    }       

}

CitizenCountryBean has relationship between visa management bean (One to Many)

@Entity
@Table(name = "citizencountrytable")
@DynamicUpdate
@SelectBeforeUpdate(true)
public class CitizenCountryBean {

    @Id
    @Column(name = "citizenId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int citizenId;

    @Column(name = "citizencountryName")
    private String citizencountryName;

    @OneToMany(targetEntity = VisaManagementBean.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "citizenId", referencedColumnName = "citizenId")
    private Set<VisaManagementBean> visaManagementList = new HashSet<VisaManagementBean>();

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<LivingCountryBean> livingCountryBeanList= new HashSet<>();

    @Column(name="createdBy", updatable=false)
    private String createdBy;

    @Column(name="modifiedBy")
    private String modifiedBy;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creationDate",updatable=false)
    private Date creationDate;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="modifiedDate")
    private Date modifiedDate;

    @Column(name = "status")
    private String status;

    public int getCitizenId() {
        return citizenId;
    }

    public String getCitizencountryName() {
        return citizencountryName;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public String getModifiedBy() {
        return modifiedBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public Date getModifiedDate() {
        return modifiedDate;
    }

    public String getStatus() {
        return status;
    }

    public void setCitizenId(int citizenId) {
        this.citizenId = citizenId;
    }

    public void setCitizencountryName(String citizencountryName) {
        this.citizencountryName = citizencountryName;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public void setModifiedBy(String modifiedBy) {
        this.modifiedBy = modifiedBy;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public void setModifiedDate(Date modifiedDate) {
        this.modifiedDate = modifiedDate;
    }

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

    public Set<LivingCountryBean> getLivingCountryBeanList() {
        return livingCountryBeanList;
    }

    public Set<VisaManagementBean> getVisaManagementList() {
        return visaManagementList;
    }

    public void setLivingCountryBeanList(Set<LivingCountryBean> livingCountryBeanList) {
        this.livingCountryBeanList = livingCountryBeanList;
    }

    public void setVisaManagementList(Set<VisaManagementBean> visaManagementList) {
        this.visaManagementList = visaManagementList;
    }

}

our 3rd bean Class LivingCountryBean and Cityzenshipship we have relationship many to many. Our all data inserted successfully in respective tables but our 3rd table that was created by hibernate from many to many relation we are getting null values.

@Entity
@Table(name = "livingcountrytable")
@DynamicUpdate 
@SelectBeforeUpdate(true)
public class LivingCountryBean {

    @Id
    @Column(name = "livingId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int livingId;

    @Column(name = "livingcountryName")
    private String livingcountryName;

    @ManyToMany(mappedBy="livingCountryBeanList")
    private Set<CitizenCountryBean> citizenCountryBeanList= new HashSet<>();

    @Column(name="createdBy", updatable=false)
    private String createdBy;

    @Column(name="modifiedBy")
    private String modifiedBy;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="creationDate",updatable=false)
    private Date creationDate;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="modifiedDate")
    private Date modifiedDate;

    @Column(name = "status")
    private String status;

    public int getLivingId() {
        return livingId;
    }

    public String getLivingcountryName() {
        return livingcountryName;
    }

    public Set<CitizenCountryBean> getCitizenCountryBeanList() {
        return citizenCountryBeanList;
    }

    public void setCitizenCountryBeanList(Set<CitizenCountryBean> citizenCountryBeanList) {
        this.citizenCountryBeanList = citizenCountryBeanList;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public String getModifiedBy() {
        return modifiedBy;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public Date getModifiedDate() {
        return modifiedDate;
    }

    public String getStatus() {
        return status;
    }

    public void setLivingId(int livingId) {
        this.livingId = livingId;
    }

    public void setLivingcountryName(String livingcountryName) {
        this.livingcountryName = livingcountryName;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public void setModifiedBy(String modifiedBy) {
        this.modifiedBy = modifiedBy;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public void setModifiedDate(Date modifiedDate) {
        this.modifiedDate = modifiedDate;
    }

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

}

Our DAO Code in Spring ORM using hibernate template class.

 @Override
        public int createVisaManagement(CitizenCountryBean citizenCountryBean) {
            Integer id = (Integer) hibernateTemplate.save(citizenCountryBean);
            return id;
        }

Try it :

CitizenCountryBean.

 @JoinTable(
        name = "CityZen_Living", 
        joinColumns = { @JoinColumn(name = "citizen_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "living_id") }
    )

CitizenCountryBean

 @JoinTable(
        name = "CityZen_Living", 
        joinColumns = { @JoinColumn(name = "living_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "citizen_id") }
    )

Note: Don't used int as primary key. I think you need use : Long or Interger. In entity , if @Column and name field same, don't need @Column. Only @Column if you want change name in field when hibernate save to database.

One thing to bear in mind. Make sure that your "object" structure is consistent before you try and make your database persistent.

I see you have back references. You need to ensure that all forward and back references are present before you try and save. If not you are going to get weirdness.

A pattern I always use is like this:

in CitizenCountryBean:

public void add(LivingCountryBean bean) {
   livingCountryBeanList.add(bean);
   bean.add0(this);
}

And in LivingCountryBean:

public void add(CitizenCountryBean bean) {
   bean.add(this);
}

public void add0(CitizenCoutryBean bean) {
   citizenCountryBeanList.add(bean);
}

This ensures that whenever you add from either side both the back reference and the forward reference are set and hibernate will correctly persist.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM