JPA #OneToMany annotation is looping - json

I'm using JPA and MySql I created 3 tables with relations #OneToMany and #ManyToOne. I'm trying to get data about records from table which have described relations. After trying to get data I got this error SyntaxError: JSON.parse: unterminated string literal at line 1 column 183719 of the JSON data. I just see a lot of records from gp_contractor table. When I use #JsonIgnore to relation with gp_contractor I can get all data from table gp_invoice and gp_invoiceitem. I have no idea what is wrong.
#Entity
#Table(name = "gp_contractor")
public class GpContractor {
private int mGpContractorRecid;
private String mGpContractorName;
private String mGpContractorNip;
private String mGpContractorStreet;
private String mGpContractorHouseNumber;
private String mGpContractorFlatNumber;
private String mGpContractorZipCode;
private String mGpContractorCity;
private Collection<GpInvoice> mGpInvoicesByGpContractorRecid;
#Id
#Column(name = "GP_CONTRACTOR_RECID", nullable = false)
public int getGpContractorRecid() {
return mGpContractorRecid;
}
public void setGpContractorRecid(int gpContractorRecid) {
mGpContractorRecid = gpContractorRecid;
}
#Basic
#Column(name = "GP_CONTRACTOR_NAME", nullable = false, length = 50)
public String getGpContractorName() {
return mGpContractorName;
}
public void setGpContractorName(String gpContractorName) {
mGpContractorName = gpContractorName;
}
#Basic
#Column(name = "GP_CONTRACTOR_NIP", nullable = false, length = 10)
public String getGpContractorNip() {
return mGpContractorNip;
}
public void setGpContractorNip(String gpContractorNip) {
mGpContractorNip = gpContractorNip;
}
#Basic
#Column(name = "GP_CONTRACTOR_STREET", nullable = false, length = 50)
public String getGpContractorStreet() {
return mGpContractorStreet;
}
public void setGpContractorStreet(String gpContractorStreet) {
mGpContractorStreet = gpContractorStreet;
}
#Basic
#Column(name = "GP_CONTRACTOR_HOUSE_NUMBER", nullable = false, length = 10)
public String getGpContractorHouseNumber() {
return mGpContractorHouseNumber;
}
public void setGpContractorHouseNumber(String gpContractorHouseNumber) {
mGpContractorHouseNumber = gpContractorHouseNumber;
}
#Basic
#Column(name = "GP_CONTRACTOR_FLAT_NUMBER", nullable = true, length = 10)
public String getGpContractorFlatNumber() {
return mGpContractorFlatNumber;
}
public void setGpContractorFlatNumber(String gpContractorFlatNumber) {
mGpContractorFlatNumber = gpContractorFlatNumber;
}
#Basic
#Column(name = "GP_CONTRACTOR_ZIP_CODE", nullable = false, length = 10)
public String getGpContractorZipCode() {
return mGpContractorZipCode;
}
public void setGpContractorZipCode(String gpContractorZipCode) {
mGpContractorZipCode = gpContractorZipCode;
}
#Basic
#Column(name = "GP_CONTRACTOR_CITY", nullable = false, length = 50)
public String getGpContractorCity() {
return mGpContractorCity;
}
public void setGpContractorCity(String gpContractorCity) {
mGpContractorCity = gpContractorCity;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GpContractor that = (GpContractor) o;
return mGpContractorRecid == that.mGpContractorRecid &&
Objects.equals(mGpContractorName, that.mGpContractorName) &&
Objects.equals(mGpContractorNip, that.mGpContractorNip) &&
Objects.equals(mGpContractorStreet, that.mGpContractorStreet) &&
Objects.equals(mGpContractorHouseNumber, that.mGpContractorHouseNumber) &&
Objects.equals(mGpContractorFlatNumber, that.mGpContractorFlatNumber) &&
Objects.equals(mGpContractorZipCode, that.mGpContractorZipCode) &&
Objects.equals(mGpContractorCity, that.mGpContractorCity);
}
#Override
public int hashCode() {
return Objects.hash(mGpContractorRecid, mGpContractorName, mGpContractorNip, mGpContractorStreet, mGpContractorHouseNumber, mGpContractorFlatNumber, mGpContractorZipCode, mGpContractorCity);
}
#OneToMany(mappedBy = "gpContractorByGpInvoiceContractor")
public Collection<GpInvoice> getGpInvoicesByGpContractorRecid() {
return mGpInvoicesByGpContractorRecid;
}
public void setGpInvoicesByGpContractorRecid(Collection<GpInvoice> gpInvoicesByGpContractorRecid) {
mGpInvoicesByGpContractorRecid = gpInvoicesByGpContractorRecid;
}
}
#Entity
#Table(name = "gp_invoice")
public class GpInvoice {
private int mGpInvoiceRecid;
private String mGpInvoiceTitle;
private String mGpInvoiceNumber;
private Date mGpInvoiceRelease;
private Date mGpInvoicePosting;
private Date mGpInvoiceDelivery;
private String mGpInvoiceReleaseplace;
private GpContractor mGpContractorByGpInvoiceContractor;
private Collection<GpInvoiceitem> mGpInvoiceitemsByGpInvoiceRecid;
#Id
#Column(name = "GP_INVOICE_RECID", nullable = false)
public int getGpInvoiceRecid() {
return mGpInvoiceRecid;
}
public void setGpInvoiceRecid(int gpInvoiceRecid) {
mGpInvoiceRecid = gpInvoiceRecid;
}
#Basic
#Column(name = "GP_INVOICE_TITLE", nullable = false, length = 50)
public String getGpInvoiceTitle() {
return mGpInvoiceTitle;
}
public void setGpInvoiceTitle(String gpInvoiceTitle) {
mGpInvoiceTitle = gpInvoiceTitle;
}
#Basic
#Column(name = "GP_INVOICE_NUMBER", nullable = false, length = 50)
public String getGpInvoiceNumber() {
return mGpInvoiceNumber;
}
public void setGpInvoiceNumber(String gpInvoiceNumber) {
mGpInvoiceNumber = gpInvoiceNumber;
}
#Basic
#Column(name = "GP_INVOICE_RELEASE", nullable = false)
public Date getGpInvoiceRelease() {
return mGpInvoiceRelease;
}
public void setGpInvoiceRelease(Date gpInvoiceRelease) {
mGpInvoiceRelease = gpInvoiceRelease;
}
#Basic
#Column(name = "GP_INVOICE_POSTING", nullable = true)
public Date getGpInvoicePosting() {
return mGpInvoicePosting;
}
public void setGpInvoicePosting(Date gpInvoicePosting) {
mGpInvoicePosting = gpInvoicePosting;
}
#Basic
#Column(name = "GP_INVOICE_DELIVERY", nullable = false)
public Date getGpInvoiceDelivery() {
return mGpInvoiceDelivery;
}
public void setGpInvoiceDelivery(Date gpInvoiceDelivery) {
mGpInvoiceDelivery = gpInvoiceDelivery;
}
#Basic
#Column(name = "GP_INVOICE_RELEASEPLACE", nullable = false, length = 50)
public String getGpInvoiceReleaseplace() {
return mGpInvoiceReleaseplace;
}
public void setGpInvoiceReleaseplace(String gpInvoiceReleaseplace) {
mGpInvoiceReleaseplace = gpInvoiceReleaseplace;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GpInvoice gpInvoice = (GpInvoice) o;
return mGpInvoiceRecid == gpInvoice.mGpInvoiceRecid &&
Objects.equals(mGpInvoiceTitle, gpInvoice.mGpInvoiceTitle) &&
Objects.equals(mGpInvoiceNumber, gpInvoice.mGpInvoiceNumber) &&
Objects.equals(mGpInvoiceRelease, gpInvoice.mGpInvoiceRelease) &&
Objects.equals(mGpInvoicePosting, gpInvoice.mGpInvoicePosting) &&
Objects.equals(mGpInvoiceDelivery, gpInvoice.mGpInvoiceDelivery) &&
Objects.equals(mGpInvoiceReleaseplace, gpInvoice.mGpInvoiceReleaseplace);
}
#Override
public int hashCode() {
return Objects.hash(mGpInvoiceRecid, mGpInvoiceTitle, mGpInvoiceNumber, mGpInvoiceRelease, mGpInvoicePosting, mGpInvoiceDelivery, mGpInvoiceReleaseplace);
}
#ManyToOne
#JoinColumn(name = "GP_INVOICE_CONTRACTOR", referencedColumnName = "GP_CONTRACTOR_RECID", nullable = false)
public GpContractor getGpContractorByGpInvoiceContractor() {
return mGpContractorByGpInvoiceContractor;
}
public void setGpContractorByGpInvoiceContractor(GpContractor gpContractorByGpInvoiceContractor) {
mGpContractorByGpInvoiceContractor = gpContractorByGpInvoiceContractor;
}
#OneToMany(mappedBy = "gpInvoiceByGpInvitInvoicerecid")
public Collection<GpInvoiceitem> getGpInvoiceitemsByGpInvoiceRecid() {
return mGpInvoiceitemsByGpInvoiceRecid;
}
public void setGpInvoiceitemsByGpInvoiceRecid(Collection<GpInvoiceitem> gpInvoiceitemsByGpInvoiceRecid) {
mGpInvoiceitemsByGpInvoiceRecid = gpInvoiceitemsByGpInvoiceRecid;
}
}
#Entity
#Table(name = "gp_invoiceitem")
public class GpInvoiceitem {
private int mGpInvitRecid;
private String mGpInvitName;
private String mGpInvitDescription;
private double mGpInvitPricenet;
private int mGpInvitAmount;
private String mGpInvitUnit;
private int mGpInvitVat;
private double mGpInvitPriceamountnet;
private double mGpInvitPricevat;
private double mGpInvitPricegross;
private GpInvoice mGpInvoiceByGpInvitInvoicerecid;
#Id
#Column(name = "GP_INVIT_RECID", nullable = false)
public int getGpInvitRecid() {
return mGpInvitRecid;
}
public void setGpInvitRecid(int gpInvitRecid) {
mGpInvitRecid = gpInvitRecid;
}
#Basic
#Column(name = "GP_INVIT_NAME", nullable = false, length = 50)
public String getGpInvitName() {
return mGpInvitName;
}
public void setGpInvitName(String gpInvitName) {
mGpInvitName = gpInvitName;
}
#Basic
#Column(name = "GP_INVIT_DESCRIPTION", nullable = true, length = 200)
public String getGpInvitDescription() {
return mGpInvitDescription;
}
public void setGpInvitDescription(String gpInvitDescription) {
mGpInvitDescription = gpInvitDescription;
}
#Basic
#Column(name = "GP_INVIT_PRICENET", nullable = false, precision = 0)
public double getGpInvitPricenet() {
return mGpInvitPricenet;
}
public void setGpInvitPricenet(double gpInvitPricenet) {
mGpInvitPricenet = gpInvitPricenet;
}
#Basic
#Column(name = "GP_INVIT_AMOUNT", nullable = false)
public int getGpInvitAmount() {
return mGpInvitAmount;
}
public void setGpInvitAmount(int gpInvitAmount) {
mGpInvitAmount = gpInvitAmount;
}
#Basic
#Column(name = "GP_INVIT_UNIT", nullable = false, length = 10)
public String getGpInvitUnit() {
return mGpInvitUnit;
}
public void setGpInvitUnit(String gpInvitUnit) {
mGpInvitUnit = gpInvitUnit;
}
#Basic
#Column(name = "GP_INVIT_VAT", nullable = false)
public int getGpInvitVat() {
return mGpInvitVat;
}
public void setGpInvitVat(int gpInvitVat) {
mGpInvitVat = gpInvitVat;
}
#Basic
#Column(name = "GP_INVIT_PRICEAMOUNTNET", nullable = false, precision = 0)
public double getGpInvitPriceamountnet() {
return mGpInvitPriceamountnet;
}
public void setGpInvitPriceamountnet(double gpInvitPriceamountnet) {
mGpInvitPriceamountnet = gpInvitPriceamountnet;
}
#Basic
#Column(name = "GP_INVIT_PRICEVAT", nullable = false, precision = 0)
public double getGpInvitPricevat() {
return mGpInvitPricevat;
}
public void setGpInvitPricevat(double gpInvitPricevat) {
mGpInvitPricevat = gpInvitPricevat;
}
#Basic
#Column(name = "GP_INVIT_PRICEGROSS", nullable = false, precision = 0)
public double getGpInvitPricegross() {
return mGpInvitPricegross;
}
public void setGpInvitPricegross(double gpInvitPricegross) {
mGpInvitPricegross = gpInvitPricegross;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
GpInvoiceitem that = (GpInvoiceitem) o;
return mGpInvitRecid == that.mGpInvitRecid &&
Double.compare(that.mGpInvitPricenet, mGpInvitPricenet) == 0 &&
mGpInvitAmount == that.mGpInvitAmount &&
mGpInvitVat == that.mGpInvitVat &&
Double.compare(that.mGpInvitPriceamountnet, mGpInvitPriceamountnet) == 0 &&
Double.compare(that.mGpInvitPricevat, mGpInvitPricevat) == 0 &&
Double.compare(that.mGpInvitPricegross, mGpInvitPricegross) == 0 &&
Objects.equals(mGpInvitName, that.mGpInvitName) &&
Objects.equals(mGpInvitDescription, that.mGpInvitDescription) &&
Objects.equals(mGpInvitUnit, that.mGpInvitUnit);
}
#Override
public int hashCode() {
return Objects.hash(mGpInvitRecid, mGpInvitName, mGpInvitDescription, mGpInvitPricenet, mGpInvitAmount, mGpInvitUnit, mGpInvitVat, mGpInvitPriceamountnet, mGpInvitPricevat, mGpInvitPricegross);
}
#ManyToOne
#JoinColumn(name = "GP_INVIT_INVOICERECID", referencedColumnName = "GP_INVOICE_RECID", nullable = false)
public GpInvoice getGpInvoiceByGpInvitInvoicerecid() {
return mGpInvoiceByGpInvitInvoicerecid;
}
public void setGpInvoiceByGpInvitInvoicerecid(GpInvoice gpInvoiceByGpInvitInvoicerecid) {
mGpInvoiceByGpInvitInvoicerecid = gpInvoiceByGpInvitInvoicerecid;
}
}
public interface InvoiceRepository extends Repository<GpInvoice, Integer> {
List<GpInvoice> findAll();
GpInvoice findByGpInvoiceRecid(long id);
void delete(GpInvoice gpInvoice);
}
#Service
public class InvoiceServiceImpl implements InvoiceService {
#Autowired
private InvoiceRepository mInvoiceRepository;
#Override
#Transactional
public List<GpInvoice> findAll() {
return mInvoiceRepository.findAll();
}
#Override
#Transactional
public GpInvoice findById(long id) {
return mInvoiceRepository.findByGpInvoiceRecid(id);
}
#Override
#Transactional
public GpInvoice delete(long id) {
GpInvoice gpInvoice = findById(id);
if (gpInvoice != null) {
mInvoiceRepository.delete(gpInvoice);
}
return gpInvoice;
}
}
#CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
#RestController
#RequestMapping(value = "/invoice")
public class InvoiceController {
#Autowired
private InvoiceService mInvoiceService;
#GetMapping(path = "/all")
public List findAllInvoices() {
return mInvoiceService.findAll();
}
#DeleteMapping(path = {"/{id}"})
public GpInvoice delete(#PathVariable("id") long id) {
return mInvoiceService.delete(id);
}
}

Related

JSON failed to lazily initialize a collection of roles

I am doing an exercise on the CRUD operations in a many-to-many relationship having attributes in the relationship table.
I am attaching my entities and I hope you can help me.
The error mentioned above occurs when I go to ask for the list of elements on the zetautente and zetamessaggio tables.
The same error occurs even when I go to ask for a single element of one of the two above mentioned tables ..
#Entity(name = "ZetaMessaggio")
#Table(name="zetamessaggio")
public class ZetaMessaggio implements Serializable {
private static final long serialVersionUID = -2387302703708194311L;
#Id
#Column(name = "id")
#GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "zetamessaggio_seq")
#SequenceGenerator(name = "zetamessaggio_seq",sequenceName = "zetamessaggio_seq",allocationSize = 1)
private Long id;
#Column(name = "titolo")
private String titolo;
#Column(name = "testo")
private String testo;
#OneToMany(
mappedBy = "zetaMessaggio",
cascade = CascadeType.ALL,
orphanRemoval = true
)
#JsonManagedReference(value="zetaMessaggio")
private List<ZetaMessaggioUtente> zetaUtente = new ArrayList<ZetaMessaggioUtente>();
public ZetaMessaggio() {
}
public ZetaMessaggio(String titolo, String testo)
{
this.titolo = titolo;
this.testo = testo;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitolo() {
return titolo;
}
public void setTitolo(String titolo) {
this.titolo = titolo;
}
public String getTesto() {
return testo;
}
public void setTesto(String testo) {
this.testo = testo;
}
public List<ZetaMessaggioUtente> getZetaUtente() {
return zetaUtente;
}
public void setZetaUtente(List<ZetaMessaggioUtente> zetaUtenti) {
this.zetaUtente = zetaUtenti;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
ZetaMessaggio other = (ZetaMessaggio) o;
return Objects.equals(new Long(this.id), new Long(other.id))
&& Objects.equals(this.titolo, other.titolo)
&& Objects.equals(this.testo, other.testo);
}
#Override
public int hashCode() {
return Objects.hash( new Long(this.id)
, this.testo
, this.titolo
);
}
}
#Entity(name = "ZetaMessaggioUtente")
#Table(name = "zetamessaggioutente")
public class ZetaMessaggioUtente implements Serializable {
private static final long serialVersionUID = 4060038267093084727L;
#EmbeddedId
private ZetaMessaggioUtenteId id;
#Column(name="data")
private String data;
#ManyToOne(fetch = FetchType.LAZY)
#MapsId("idMessaggio")
#JoinColumn(name = "idMessaggio")
#JsonBackReference(value = "zetaMessaggio")
private ZetaMessaggio zetaMessaggio;
#ManyToOne(fetch = FetchType.LAZY)
#MapsId("idUtente")
#JoinColumn(name = "idUtente")
#JsonBackReference(value = "zetaUtente")
private ZetaUtente zetaUtente;
private ZetaMessaggioUtente() {}
public ZetaMessaggioUtente(ZetaMessaggioUtenteId id)
{
this.id = id;
}
public ZetaMessaggioUtente(ZetaMessaggio messaggio, ZetaUtente utente)
{
this.zetaMessaggio = messaggio;
this.zetaUtente = utente;
this.id = new ZetaMessaggioUtenteId(messaggio.getId(), utente.getId());
}
public ZetaMessaggioUtenteId getId() {
return id;
}
public void setId(ZetaMessaggioUtenteId id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public ZetaMessaggio getZetaMessaggio() {
return zetaMessaggio;
}
public void setZetaMessaggio(ZetaMessaggio zetaMessaggio) {
this.zetaMessaggio = zetaMessaggio;
}
public ZetaUtente getZetaUtente() {
return zetaUtente;
}
public void setZetaUtente(ZetaUtente zetaUtente) {
this.zetaUtente = zetaUtente;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
{
return false;
}
ZetaMessaggioUtente other = (ZetaMessaggioUtente) o;
return Objects.equals(zetaMessaggio, other.zetaMessaggio)
&& Objects.equals(zetaUtente, other.zetaUtente)
;
}
#Override
public int hashCode()
{
return Objects.hash(zetaMessaggio, zetaUtente);
}
}
#Embeddable
public class ZetaMessaggioUtenteId implements Serializable {
private static final long serialVersionUID = -7372159721389421199L;
#Column(name = "idMessaggio")
private Long idMessaggio;
#Column(name = "idUtente")
private Long idUtente;
private ZetaMessaggioUtenteId(){}
public ZetaMessaggioUtenteId(Long idMessaggio,Long idUtente){
setIdMessaggio(idMessaggio);
setIdUtente(idUtente);
}
public Long getIdMessaggio() {
return idMessaggio;
}
public void setIdMessaggio(Long idMessaggio) {
this.idMessaggio = idMessaggio;
}
public Long getIdUtente() {
return idUtente;
}
public void setIdUtente(Long idUtente) {
this.idUtente = idUtente;
}
#Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass())
{
return false;
}
ZetaMessaggioUtenteId other = (ZetaMessaggioUtenteId) o;
return Objects.equals(new Long(this.idMessaggio), new Long(other.idMessaggio)) &&
Objects.equals(new Long(this.idUtente), new Long(other.idUtente))
;
}
#Override
public int hashCode()
{
return Objects.hash( new Long(this.idMessaggio)
, new Long(this.idUtente)
);
}
}
#Entity(name = "ZetaUtenti")
#Table(name = "zetautenti",uniqueConstraints = {#UniqueConstraint(columnNames = {"Id"})})
public class ZetaUtente implements Serializable {
private static final long serialVersionUID = -5338956772143977741L;
#Id
#Column(name="id")
#GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "zetautenti_seq")
#SequenceGenerator(name = "zetautenti_seq",sequenceName = "zetautenti_seq",allocationSize = 1)
private Long id;
#Column(name = "nome")
private String nome;
#Column(name = "cognome")
private String cognome;
#OneToMany(
mappedBy = "zetaUtente",
cascade = CascadeType.ALL,
orphanRemoval = true
)
#JsonManagedReference(value="zetaUtente")
private List<ZetaMessaggioUtente> zetaMessaggio = new ArrayList<ZetaMessaggioUtente>();
public ZetaUtente() {
}
public ZetaUtente(String nome, String cognome)
{
this.nome = nome;
this.cognome = cognome;
}
public Long getId() {
return id;
}
public void setId(Long id) {
id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public List<ZetaMessaggioUtente> getZetaMessaggio() {
return zetaMessaggio;
}
public void setZetaMessaggio(List<ZetaMessaggioUtente> zetaMessaggi) {
this.zetaMessaggio = zetaMessaggi;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
ZetaUtente other = (ZetaUtente) o;
return Objects.equals(new Long(this.id), new Long(other.id))
&& Objects.equals(this.nome, other.nome)
&& Objects.equals(this.cognome, other.cognome);
}
#Override
public int hashCode() {
return Objects.hash( new Long(this.id)
, this.nome
, this.cognome
);
}
}
By default #OneToMany and #ManyToMany relationships are lazy, so you need to handle receiving lazy data.
There are plenty of advices on the internet, it's very strange that you are asking this question, but if very quickly, you have few ways for getting lazy collection:
Antipatterns: OpenSessionInView and enable_lazy_load_no_trans
Most popular way: to use #Transactional annotation (auto attach object to session pool) or manual with start transaction, get collection, close transactional
Similar way: Hibernate.initialize(<get collection method>)
Manual way: use own SQL request with "JOIN FETCH ..."
Alternative way: to use #Fetch(FetchMode.SUBSELECT) (cannot say anything)
Not proper way (but the fastest temporary solution): to use FetchMode.EAGER for collection
Collections are lazily loaded by default, if you are not aware of this thing then you can check the link Lazy loading of collection.
To make your code working you need to add following in OneToMany :
fetch = FetchType.EAGER

How to join two tables and iterate in hibernate

How to write hibernate query to get list with below columns which is executed in mysql query executed in jdbc. How to write HQL query in my Main class please let me know
Parent Entity
#Entity
#Table(name = "parent_info")
public class ParentDTO {
#Id
#GenericGenerator(name = "j", strategy = "increment")
#GeneratedValue(generator = "j")
#Column(name = "P_ID")
private int p_id;
#Column(name = "P_NAME")
private String p_name;
#Column(name = "P_PHONE")
private String p_phone;
#Column(name = "P_EMAIL")
private String p_email;
#Column(name = "REF_ID")
private String ref_id;
#OneToMany(cascade={CascadeType.ALL})
#JoinColumn(name="student_id")
private List<StudentDTO> students;
public List<StudentDTO> getStudents() {
return students;
}
public void setStudents(List<StudentDTO> students) {
this.students = students;
}
public int getP_id() {
return p_id;
}
public void setP_id(int p_id) {
this.p_id = p_id;
}
public String getP_name() {
return p_name;
}
public void setP_name(String p_name) {
this.p_name = p_name;
}
public String getP_phone() {
return p_phone;
}
public void setP_phone(String p_phone) {
this.p_phone = p_phone;
}
public String getP_email() {
return p_email;
}
public void setP_email(String p_email) {
this.p_email = p_email;
}
public String getRef_id() {
return ref_id;
}
public void setRef_id(String ref_id) {
this.ref_id = ref_id;
}
}
Student Entity class
#Entity
#Table(name = "student_info")
public class StudentDTO {
#Id
#GenericGenerator(name = "j", strategy = "increment")
#GeneratedValue(generator = "j")
#Column(name = "S_ID")
private int s_id;
#Column(name = "S_NAME")
private String s_name;
#Column(name = "S_PHONE")
private String s_phone;
#Column(name = "S_EMAIL")
private String s_email;
#Column(name = "REF_ID")
private String ref_id;
#Column(name = "S_CLASS_NAME")
private String s_class_name;
#ManyToOne
#JoinColumn(name="parent_id")
private ParentDTO parent;
public ParentDTO getParent() {
return parent;
}
public void setParent(ParentDTO parent) {
this.parent = parent;
}
public int getS_id() {
return s_id;
}
public void setS_id(int s_id) {
this.s_id = s_id;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public String getS_phone() {
return s_phone;
}
public void setS_phone(String s_phone) {
this.s_phone = s_phone;
}
public String getS_email() {
return s_email;
}
public void setS_email(String s_email) {
this.s_email = s_email;
}
public String getRef_id() {
return ref_id;
}
public void setRef_id(String ref_id) {
this.ref_id = ref_id;
}
public String getS_class_name() {
return s_class_name;
}
public void setS_class_name(String s_class_name) {
this.s_class_name = s_class_name;
}
}
Main class
public class Test {
public static void main(String[] args) {
Session session = null;
Transaction tx = null;
List<StudentDTO> groupList = null;
try {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
session.beginTransaction();
session.getTransaction().commit();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
session.close();
}
}
}
My SQL query executed in jdbc
select pt.P_MOBILE,pt.P_EMAIL, st.S_FIRSTNAME,st.REF_ID from parent_info pt join student_info st on pt.REF_ID = st.REF_ID where st.S_CLASS_TO_JOIN = 10;
String query="paste your query here ";
List<Object[]> objects = session.createSQLQuery(query).list();
ListIterator<Object[]> iterator = objects.listIterator();
while (iterator.hasNext()) {
Object[] object = (Object[]) iterator.next();
int firstcolumn=(Integer) object[0];
int secondcolumn=(Integer) object[1];
}

Control the order the tables have been created in jpa

Does it exist a way to control the order in which the tables have been created by the persistence provider? I got this mysql 1146 error. I suppose it happens because it try to create an entity that needs for reservation table but it doesn't found it so this cause the following exception. Does exist a way to fix that?
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'volaconnoi_db.reservation' doesn't exist
Error Code: 1146
Call: ALTER TABLE RESERVATION ADD CONSTRAINT FK_RESERVATION_ROUTE_ID_ROUTE FOREIGN KEY (ROUTE_ID_ROUTE) REFERENCES ROUTE (ID_ROUTE)
Query: DataModifyQuery(sql="ALTER TABLE RESERVATION ADD CONSTRAINT FK_RESERVATION_ROUTE_ID_ROUTE FOREIGN KEY (ROUTE_ID_ROUTE) REFERENCES ROUTE (ID_ROUTE)")
This is the USER_CREDENTIAL entity
#Entity
#Table(name = "USER_CREDENTIAL")
#SecondaryTable(name = "CLIENT", pkJoinColumns=#PrimaryKeyJoinColumn(name="USERNAME"))
public class UserCredential implements Serializable
{
private String username;
private String password;
private String email;
private String group_name;
private Date create_date;
private String name;
private String surname;
private String address;
private String city;
private String zip_code;
private String country;
private int fidelity_points;
private List<PhoneNumber> phoneNumbers;
private List<Reservation> reservationsList;
public UserCredential()
{
}
#Id
#Column(name = "USERNAME", nullable = false)
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
#Column(name = "PASSWORD", nullable = false)
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
#Column(name = "EMAIL", nullable = false)
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
#Column(name = "GROUP_NAME", insertable = false, updatable = false)
public String getGroup_name()
{
return group_name;
}
public void setGroup_name(String group_name)
{
this.group_name = group_name;
}
#Column(name = "CREATE_DATE", insertable = false, updatable = false)
#Temporal(TemporalType.TIMESTAMP)
public Date getCreate_date()
{
return create_date;
}
public void setCreate_date(Date create_date)
{
this.create_date = create_date;
}
#Column(name = "NAME", nullable= false, table="CLIENT")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
#Column(name = "SURNAME", nullable= false, table = "CLIENT")
public String getSurname()
{
return surname;
}
public void setSurname(String surname)
{
this.surname = surname;
}
#Column(name = "ADDRESS", nullable= false , table = "CLIENT")
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
#Column(name = "CITY", nullable = false, table = "CLIENT")
public String getCity()
{
return city;
}
public void setCity(String city)
{
this.city = city;
}
#Column(name = "ZIP_CODE", nullable = false, table = "CLIENT")
public String getZip_code()
{
return zip_code;
}
public void setZip_code(String zip_code)
{
this.zip_code = zip_code;
}
#Column(name = "COUNTRY", nullable = false, table = "CLIENT")
public String getCountry()
{
return country;
}
public void setCountry(String country)
{
this.country = country;
}
#Column(name = "FIDELITY_POINTS", nullable = false, table = "CLIENT")
public int getFidelity_points()
{
return fidelity_points;
}
public void setFidelity_points(int fidelity_points)
{
this.fidelity_points = fidelity_points;
}
#ElementCollection
#CollectionTable(name = "CLIENT_PHONE_NUMBER", joinColumns = #JoinColumn(name = "USERNAME"))
public List<PhoneNumber> getPhoneNumbers()
{
return phoneNumbers;
}
public void setPhoneNumbers (List<PhoneNumber> phoneNumbers)
{
this.phoneNumbers = phoneNumbers;
}
#OneToMany(mappedBy = "username", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public List<Reservation> getReservationsList()
{
return reservationsList;
}
public void setReservationsList(List<Reservation> reservationsList)
{
this.reservationsList = reservationsList;
}
#Override
public int hashCode()
{
int hash = 0;
hash += (username != null ? username.hashCode() : 0);
return hash;
}
#Override
public boolean equals(Object object)
{
// TODO: Warning - this method won't work in the case the username fields are not set
if (!(object instanceof UserCredential))
{
return false;
}
UserCredential other = (UserCredential) object;
if ((this.username == null && other.username != null) || (this.username != null && !this.username.equals(other.username)))
{
return false;
}
return true;
}
#Override
public String toString()
{
return "it.volaconoi.entity.UserCredential[ id=" + username + " ]";
}
}
THIS IS THE ROUTE ENTITY
#Entity
#Table(name = "ROUTE")
public class Route implements Serializable
{
private String id_route;
private String airlane;
private String aircraft_id;
private Airport airport_city_source;
private Airport airport_city_dest;
private Date departure_date;
private Date arrival_date;
private String travel_class;
private int seats;
private float price;
private List<Reservation> reservationsList;
public Route()
{
}
#PrePersist
public void setIdRoute()
{
SimpleDateFormat sdf = new SimpleDateFormat("ddMMYYYYHHmm");
String format_departure_date = sdf.format(this.getDeparture_date());
String unique_id_route = this.getAirlane() +
this.getAircraft_id() +
this.getAirport_city_source().getCity() +
this.getAirport_city_dest().getCity() +
format_departure_date;
this.setId_route(unique_id_route.replaceAll(" ", ""));
}
#Id
#Column(name = "ID_ROUTE")
public String getId_route()
{
return id_route;
}
public void setId_route(String id_route)
{
this.id_route = id_route;
}
#Column(name = "AIRLANE", nullable = false)
public String getAirlane()
{
return airlane;
}
public void setAirlane(String airlane)
{
this.airlane = airlane;
}
#Column(name = "AIRCRAFT_ID", nullable = false)
public String getAircraft_id()
{
return aircraft_id;
}
public void setAircraft_id(String aircraft_id)
{
this.aircraft_id = aircraft_id;
}
#OneToOne(optional = false)
public Airport getAirport_city_source()
{
return airport_city_source;
}
public void setAirport_city_source(Airport airport_city_source)
{
this.airport_city_source = airport_city_source;
}
#OneToOne(optional = false)
public Airport getAirport_city_dest()
{
return airport_city_dest;
}
public void setAirport_city_dest(Airport airport_city_dest)
{
this.airport_city_dest = airport_city_dest;
}
#Column(name = "DEPARTURE_DATE", nullable = false)
#Temporal(TemporalType.TIMESTAMP)
public Date getDeparture_date()
{
return this.departure_date;
}
public void setDeparture_date(Date departure_date)
{
this.departure_date = departure_date;
}
#Column(name = "ARRIVAL_DATE", nullable = false)
#Temporal(TemporalType.TIMESTAMP)
public Date getArrival_date()
{
return arrival_date;
}
public void setArrival_date(Date arrival_date)
{
this.arrival_date = arrival_date;
}
#Column(name = "TRAVEL_CLASS", nullable = false)
public String getTravel_class()
{
return travel_class;
}
public void setTravel_class(String travel_class)
{
this.travel_class = travel_class;
}
#Column(name = "SEATS", nullable = false)
public int getSeats()
{
return seats;
}
public void setSeats(int seats)
{
this.seats = seats;
}
#Column(name = "PRICE", nullable = false)
public float getPrice()
{
return price;
}
public void setPrice(float price)
{
this.price = price;
}
#OneToMany(mappedBy = "route", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public List<Reservation> getReservationsList()
{
return reservationsList;
}
public void setReservationsList(List<Reservation> reservationsList)
{
this.reservationsList = reservationsList;
}
#Override
public int hashCode()
{
int hash = 0;
hash += (id_route != null ? id_route.hashCode() : 0);
return hash;
}
#Override
public boolean equals(Object object)
{
// TODO: Warning - this method won't work in the case the id_route fields are not set
if (!(object instanceof Route))
{
return false;
}
Route other = (Route) object;
if ((this.id_route == null && other.id_route != null) || (this.id_route != null && !this.id_route.equals(other.id_route)))
{
return false;
}
return true;
}
#Override
public String toString()
{
return "it.volaconoi.entity.Route[ id=" + id_route + " ]";
}
}
This is the RESERVATION entity
#Entity
#Table(name = "RESERVATION")
public class Reservation implements Serializable
{
private String id;
private int passengers;
private int luggages;
private float price;
private Date date_reservation;
private boolean cancelled;
private UserCredential username;
private Route route;
public Reservation()
{
}
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "ID_RESERVATION")
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
#Column(name = "PASSENGERS", nullable = false)
public int getPassengers()
{
return passengers;
}
public void setPassengers(int passengers)
{
this.passengers = passengers;
}
#Column(name = "LUGGAGES", nullable = false)
public int getLuggages()
{
return luggages;
}
public void setLuggages(int luggages)
{
this.luggages = luggages;
}
#Column(name = "PRICE", nullable = false)
public float getPrice()
{
return price;
}
public void setPrice(float price)
{
this.price = price;
}
#Column(name = "DATE_PLACED", insertable = false, updatable = false)
#Temporal(TemporalType.TIMESTAMP)
public Date getDate_reservation()
{
return date_reservation;
}
public void setDate_reservation(Date date_reservation)
{
this.date_reservation = date_reservation;
}
#Column(name = "CANCELLED", nullable = false)
public boolean isCancelled()
{
return cancelled;
}
public void setCancelled(boolean cancelled)
{
this.cancelled = cancelled;
}
#ManyToOne
#JoinColumn(name = "USERNAME", nullable = false)
public UserCredential getUsername()
{
return username;
}
public void setUsername(UserCredential username)
{
this.username = username;
}
#ManyToOne
#JoinColumn(name = "ID_ROUTE", nullable = false)
public Route getRoute()
{
return route;
}
public void setRoute(Route route)
{
this.route = route;
}
#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 Reservation))
{
return false;
}
Reservation other = (Reservation) 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 "it.volaconoi.entity.Reservation[ id=" + id + " ]";
}
}
As you may see these three entities are related to each one
I believe this is an error so fixing this may make your problem go away. Then again this may be unrelated:
In Reservation, the type of id is String, but in getId() you specify GenerationType.IDENTITY. AFAIK MySQL doesn't support auto generation of string IDs but only integer IDs. Remove this and see if things work.
UPDATE:
I've reproduced the error on my machine, and this is indeed the problem. If you check your output you will find a warning (not an error) similar to:
[EL Warning]: 2014-06-20
15:47:46.224--ServerSession(1565614310)--Exception [EclipseLink-4002]
(Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5):
org.eclipse.persistence.exceptions.DatabaseException Internal
Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
Incorrect column specifier for column 'ID' Error Code: 1063 Call:
CREATE TABLE NEWENTITY (ID VARCHAR(255) AUTO_INCREMENT NOT NULL, NAME
VARCHAR(255), PRIMARY KEY (ID)) Query: DataModifyQuery(sql="CREATE
TABLE NEWENTITY (ID VARCHAR(255) AUTO_INCREMENT NOT NULL, NAME
VARCHAR(255), PRIMARY KEY (ID))")
I imagine you missed it because it's a warning and not an error. I also imagine this gets output as a warning and not an error because sometimes an error creating the table is not an issue (for example, if the table already exists). EclipseLink apparently isn't smart enough to handle cases where there is a true error, so it outputs as a warning (see "JPA sucks", above).
The EclipseLink/MySQL combination does not support a generation type of IDENTITY for String IDs. IDENTITY means that it's up to the database (and not the JPA implementation provider) to create the ID. MySQL only supports creating integer IDs so the column type must be integer if you use AUTO INCREMENT (see the generated code).
If you really want your IDs to be a String but also automatically generate an ID, then use a generation type of AUTO. AUTO means the JPA implementation provider will handle creating the IDs; EclipseLink will use a sequence table and will handle converting the values there to a String for you.

Excluding properties from JSON processing in Struts2

I have the following (full) entity class.
public class StateTable implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "state_id", nullable = false)
private Long stateId;
#Column(name = "state_name", length = 45)
private String stateName;
#OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY)
private Set<UserTable> userTableSet;
#OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY)
private Set<City> citySet;
#OneToMany(mappedBy = "stateId", fetch = FetchType.LAZY)
private Set<Inquiry> inquirySet;
#OneToMany(mappedBy = "shippingState", fetch = FetchType.LAZY)
private Set<OrderTable> orderTableSet;
#OneToMany(mappedBy = "paymentState", fetch = FetchType.LAZY)
private Set<OrderTable> orderTableSet1;
#JoinColumn(name = "country_id", referencedColumnName = "country_id")
#ManyToOne(fetch = FetchType.LAZY)
private Country countryId;
public StateTable() {
}
public StateTable(Long stateId) {
this.stateId = stateId;
}
public Long getStateId() {
return stateId;
}
public void setStateId(Long stateId) {
this.stateId = stateId;
}
public String getStateName() {
return stateName;
}
public void setStateName(String stateName) {
this.stateName = stateName;
}
#XmlTransient
public Set<UserTable> getUserTableSet() {
return userTableSet;
}
public void setUserTableSet(Set<UserTable> userTableSet) {
this.userTableSet = userTableSet;
}
#XmlTransient
public Set<City> getCitySet() {
return citySet;
}
public void setCitySet(Set<City> citySet) {
this.citySet = citySet;
}
#XmlTransient
public Set<Inquiry> getInquirySet() {
return inquirySet;
}
public void setInquirySet(Set<Inquiry> inquirySet) {
this.inquirySet = inquirySet;
}
#XmlTransient
public Set<OrderTable> getOrderTableSet() {
return orderTableSet;
}
public void setOrderTableSet(Set<OrderTable> orderTableSet) {
this.orderTableSet = orderTableSet;
}
#XmlTransient
public Set<OrderTable> getOrderTableSet1() {
return orderTableSet1;
}
public void setOrderTableSet1(Set<OrderTable> orderTableSet1) {
this.orderTableSet1 = orderTableSet1;
}
public Country getCountryId() {
return countryId;
}
public void setCountryId(Country countryId) {
this.countryId = countryId;
}
#Override
public int hashCode() {
int hash = 0;
hash += (stateId != null ? stateId.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 StateTable)) {
return false;
}
StateTable other = (StateTable) object;
if ((this.stateId == null && other.stateId != null) || (this.stateId != null && !this.stateId.equals(other.stateId))) {
return false;
}
return true;
}
#Override
public String toString() {
return "model.StateTable[ stateId=" + stateId + " ]";
}
}
I need only two properties from this class as a JSON response namely, stateId and stateName. The rest of the properties must be ignored from being processed/serialized by JSON.
I have tried to set json.excludeProperties to the json interceptor as follows.
#Namespace("/admin_side")
#ResultPath("/WEB-INF/content")
#ParentPackage(value="json-default")
public final class StateListAction extends ActionSupport implements Serializable, ValidationAware
{
#Autowired
private final transient SharableService sharableService=null;
private static final long serialVersionUID = 1L;
private Long id;
List<StateTable>stateTables=new ArrayList<StateTable>();
public StateListAction() {}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
#JSON(name="stateTables")
public List<StateTable> getStateTables() {
return stateTables;
}
public void setStateTables(List<StateTable> stateTables) {
this.stateTables = stateTables;
}
#Action(value = "PopulateStateList",
results = {
#Result(type="json", name=ActionSupport.SUCCESS, params={"json.enableSMD", "true", "json.enableGZIP", "true", "json.excludeNullProperties", "true", "json.root", "stateTables", "json.excludeProperties", "userTableSet, citySet, inquirySet, orderTableSet, orderTableSet1, countryId", "validation.validateAnnotatedMethodOnly", "true"})})
public String populateStateList() throws Exception
{
System.out.println("countryId = "+id);
stateTables=sharableService.findStatesByCountryId(id);
return ActionSupport.SUCCESS;
}
}
The remaining properties are expected to be ignored after doing this but it doesn't seem to work. Number of SQL statements associated with all of the entity classes are generated which in turn causes other severe errors to occur like,
org.apache.struts2.json.JSONException: java.lang.IllegalAccessException: Class
org.apache.struts2.json.JSONWriter can not access a member of class
org.joda.time.tz.DateTimeZoneBuilder$PrecalculatedZone with modifiers "public"
What am I missing here? How to ignore all the properties except stateId and stateName?
I'm using Struts2-json-plugin-2.3.16.
You need to configure includeProperties in the json result. For example
#Result(type="json", params = {"contentType", "text/javascript", "includeProperties",
"stateTables\\[\\d+\\]\\.stateId,stateTables\\[\\d+\\]\\.stateName"})

Adding data to multiple tables using Spring forms in Spring MVC

I have the following database schema and I need to add data to all three tables using a single view http://i.stack.imgur.com/3HXhC.png (Due to stackoverflow rules, I cannot link the image directly).
What I hope to achieve, is to create an order, have it given an Workshop order id, and have it linked to LineItems which will let the user specify the quantity of items from the Inventory table to be added to the order.
I can create a workshop order in my database, and create a lineitem with the workshop orders id, and add the id and quantity from an inventory item into the lineitem table, and then use the attached code to display each lineitem orderline, with the total amount of items, which item is in the order, total price, customer name etc.
How do I go about creating a view that will let me create an order this way? The flow I imagine is:
Create workshop order -> add line items from inventory -> save the order.
Having worked on Spring and Hibernate for only a couple of weeks, I have not really figured out a smart approach to solve this, but hopefully someone in here has. By all means, feel free to criticize my database scheme, my classes and anything else. It may be a stupid design, not well suited for an actual production system.
I have attached my primary classes involved in this.
LineItems.java
#Entity
#Table(name = "LINE_ITEMS")
#AssociationOverrides({
#AssociationOverride(name = "pk.inventory",
joinColumns = #JoinColumn(name = "INVENTORY_Id")),
#AssociationOverride(name = "pk.workshop",
joinColumns = #JoinColumn(name = "WORKSHOP_ORDERS_Id"))
})
public class LineItems implements Serializable {
private static final long serialVersionUID = 5703588914404465647L;
#EmbeddedId
private LineItemsPK pk = new LineItemsPK();
private int quantity;
public LineItems() {
}
public LineItemsPK getPK() {
return pk;
}
public void setPK(LineItemsPK pk) {
this.pk = pk;
}
#Column(name = "WORKSHOP_ORDERS_Id", nullable=false, updatable=false,
insertable=false)
public Long getWorkshopOrdersId() {
return getPK().getWorkshop().getId();
}
#Column(name = "Id")
#JoinColumn(name="INVENTORY_Id", nullable=false, updatable=false, insertable=false)
public Long getInventoryId() {
return getPK().getInventory().getId();
}
#ManyToOne
public Workshop getWorkshop() {
return getPK().getWorkshop();
}
public void setWorkshop(Workshop workshop) {
getPK().setWorkshop(workshop);
}
#ManyToOne
#JoinColumn(name = "INVENTORY_Id")
public Inventory getInventory() {
return getPK().getInventory();
}
public void setInventory(Inventory inventory) {
getPK().setInventory(inventory);
}
public int getQuantity() {
return this.quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
LineItems that = (LineItems) o;
if (getPK() != null ? !getPK().equals(that.getPK())
: that.getPK() != null) {
return false;
}
return true;
}
public int hashCode() {
return (getPK() != null ? getPK().hashCode() : 0);
}
}
LineItemsPK.java
#Embeddable
public class LineItemsPK implements Serializable {
private static final long serialVersionUID = -4285130025882317338L;
#ManyToOne
private Inventory inventory;
#ManyToOne
private Workshop workshop;
public Workshop getWorkshop() {
return workshop;
}
public void setWorkshop(Workshop workshop) {
this.workshop = workshop;
}
public Inventory getInventory() {
return inventory;
}
public void setInventory(Inventory inventory) {
this.inventory = inventory;
}
#Override
public boolean equals(Object o) {
if(this == o) {
return true;
}
if(o == null || getClass() != o.getClass()) {
return false;
}
LineItemsPK that = (LineItemsPK) o;
if(workshop != null ? !workshop.equals(that.workshop) : that.workshop != null) {
return false;
}
if(inventory != null ? !inventory.equals(that.inventory) : that.inventory != null) {
return false;
}
return true;
}
#Override
public int hashCode() {
int result;
result = (workshop != null ? workshop.hashCode() : 0);
result = 31 * result + (inventory != null ? inventory.hashCode() : 0);
return result;
}
}
Workshop.java
#Entity
#Table(name = "WORKSHOP_ORDERS")
public class Workshop implements Serializable {
private static final long serialVersionUID = -8106245965993313684L;
public Long id;
public Long inventoryItemId;
public String workshopService;
public String workshopNotes;
public Long customersId;
public Long paymentId;
private Customer customer;
private Payment payment;
private Set<LineItems> lineItems = new HashSet<LineItems>(0);
public Workshop() {
}
public Workshop(Long inventoryItemId, String workshopService, String workshopNotes,
Customer customer, Payment payment) {
this.inventoryItemId = inventoryItemId;
this.workshopService = workshopService;
this.workshopNotes = workshopNotes;
this.customer = customer;
this.payment = payment;
}
public Workshop(Long inventoryItemId, String workshopService, String workshopNotes,
Customer customer, Payment payment, Set<LineItems> lineItems) {
this.inventoryItemId = inventoryItemId;
this.workshopService = workshopService;
this.workshopNotes = workshopNotes;
this.customer = customer;
this.payment = payment;
this.lineItems = lineItems;
}
#OneToMany(mappedBy = "pk.workshop", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Set<LineItems> getLineItems() {
return this.lineItems;
}
public void setLineItems(Set<LineItems> lineItems) {
this.lineItems = lineItems;
}
#ManyToOne
#JoinColumn(name="CUSTOMERS_Id", nullable = false, insertable = false, updatable = false)
public Customer getCustomer() {
return customer;
}
public void setCustomer(final Customer customer) {
this.customer = customer;
}
#OneToOne(cascade = CascadeType.ALL)
#JoinColumn(name="PAYMENT_Id", insertable = false, updatable = false, nullable = false)
public Payment getPayment() {
return payment;
}
public void setPayment(final Payment payment) {
this.payment = payment;
}
#Id
#GeneratedValue(strategy = IDENTITY)
#Column(name = "Id", nullable = false)
public Long getId() {
return id;
}
#Column(name = "InventoryItemId")
public Long getInventoryItemId() {
return inventoryItemId;
}
#Column(name = "WorkshopService")
public String getWorkshopService() {
return workshopService;
}
#Column(name = "WorkshopNotes")
public String getWorkshopNotes() {
return workshopNotes;
}
#Column(name = "CUSTOMERS_Id")
public Long getCustomersId() {
return customersId;
}
#Column(name = "PAYMENT_Id")
public Long getPaymentId() {
return paymentId;
}
public void setId(Long id) {
this.id = id;
}
public void setInventoryItemId(Long inventoryItemId) {
this.inventoryItemId = inventoryItemId;
}
public void setWorkshopService(String workshopService) {
this.workshopService = workshopService;
}
public void setWorkshopNotes(String workshopNotes) {
this.workshopNotes = workshopNotes;
}
public void setCustomersId(Long customersId) {
this.customersId = customersId;
}
public void setPaymentId(Long paymentId) {
this.paymentId = paymentId;
}
public String toString() {
return "Customer id: " + this.customersId + "Notes: " + workshopNotes;
}
}
Inventory.java
#Entity
#Table(name = "INVENTORY")
public class Inventory implements Serializable {
private static final long serialVersionUID = -8907719450013387551L;
private Long id;
private String itemName;
private String itemVendorName;
private Long itemInventoryStatus;
private Double itemBuyPrice;
private Double itemSellPrice;
private Set<LineItems> lineItems = new HashSet<LineItems>(0);
public Inventory() {
}
public Inventory(String itemName, String itemVendorName, Long itemInventoryStatus,
Double itemBuyPrice, Double itemSellPrice) {
this.itemName = itemName;
this.itemVendorName = itemVendorName;
this.itemInventoryStatus = itemInventoryStatus;
this.itemBuyPrice = itemBuyPrice;
this.itemSellPrice = itemSellPrice;
}
public Inventory(String itemName, String itemVendorName, Long itemInventoryStatus,
Double itemBuyPrice, Double itemSellPrice, Set<LineItems> lineItems) {
this.itemName = itemName;
this.itemVendorName = itemVendorName;
this.itemInventoryStatus = itemInventoryStatus;
this.itemBuyPrice = itemBuyPrice;
this.itemSellPrice = itemSellPrice;
this.lineItems = lineItems;
}
#OneToMany(mappedBy = "pk.inventory", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Set<LineItems> getLineItems() {
return this.lineItems;
}
public void setLineItems(Set<LineItems> lineItems) {
this.lineItems = lineItems;
}
#Id
#Column(name = "Id", nullable = false)
#GeneratedValue(strategy = IDENTITY)
public Long getId() {
return this.id;
}
#Column(name = "ItemName")
public String getItemName() {
return this.itemName;
}
#Column(name = "ItemVendorName")
public String getItemVendorName() {
return this.itemVendorName;
}
#Column(name = "ItemInventoryStatus")
public Long getItemInventoryStatus() {
return this.itemInventoryStatus;
}
#Column(name = "ItemBuyPrice")
public Double getItemBuyPrice() {
return this.itemBuyPrice;
}
#Column(name = "ItemSellPrice")
public Double getItemSellPrice() {
return this.itemSellPrice;
}
public void setId(Long id) {
this.id = id;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public void setItemVendorName(String itemVendorName) {
this.itemVendorName = itemVendorName;
}
public void setItemInventoryStatus(Long itemInventoryStatus) {
this.itemInventoryStatus = itemInventoryStatus;
}
public void setItemBuyPrice(Double itemBuyPrice) {
this.itemBuyPrice = itemBuyPrice;
}
public void setItemSellPrice(Double itemSellPrice) {
this.itemSellPrice = itemSellPrice;
}
public String toString() {
return "Item id:" + this.id + " ItemName: " + this.itemName +
" ItemInventoryStatus: " + this.itemInventoryStatus +
" ItemBuyPrice: " + this.itemBuyPrice + " ItemSellPrice " + this.itemSellPrice;
}
}
This isn't really a question as it is more of a "how would I do this"
What have you tried already?
Where are you running into trouble?
etc.
Your view logic should not be coupled with your domain layer, what I mean is, you write your forms to be as usable as possible yet, still get the information you need. Once you post the information to the backing Controller, you do the required business logic in order to line up how the entities persist, etc.
Continuing this line of thinking, your controller should only be worried about web layer exceptions, and passing information on to the Business / Service Layer. From the Business / Service layer you execute required logic, and pass on to the Domain / Repository layer. This gives a clear separation of concerns allowing for easier testing.