Is it possible to have one column in two foreign keys, because I get error when i use it? My table with two foreign keys looks like this:
package com.example.proizvodnja_mleka_backend.model;
import com.example.proizvodnja_mleka_backend.model.id.OperacijaId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@IdClass(value = OperacijaId.class)
@Table(name = "OPERACIJA")
public class Operacija implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "O_ID")
private Integer operacijaId;
@Id
@ManyToOne(optional=false)
@JoinColumns({
@JoinColumn(name="PROIZVOD_TC_ID", referencedColumnName="PROIZVOD_TC_ID", insertable=false, updatable=false),
@JoinColumn(name="PROIZVOD_CP_ID", referencedColumnName="PROIZVOD_CP_ID", insertable=false, updatable=false),
@JoinColumn(name="TP_ID", referencedColumnName="TP_ID", insertable=false, updatable=false),
@JoinColumn(name="TEP_ID", referencedColumnName="TEP_ID", insertable=false, updatable=false)
})
private TehnoloskiPostupak tehnoloskiPostupak;
@Id
@OneToOne(optional=false)
@JoinColumns({
@JoinColumn(name="PROIZVOD_TC_ID", referencedColumnName="TC_ID", insertable=false, updatable=false),
@JoinColumn(name="PROIZVOD_CP_ID", referencedColumnName="CP_ID", insertable=false, updatable=false),
@JoinColumn(name="SASTAVNICA_DEO_TC_ID", referencedColumnName="DEO_TC_ID", insertable=false, updatable=false),
@JoinColumn(name="SASTAVNICA_DEO_CP_ID", referencedColumnName="DEO_CP_ID", insertable=false, updatable=false)
})
private Sastavnica sastavnica;
@Column(name = "O_NAZIV")
private String naziv;
@Column(name = "O_OPIS")
private String opis;
@Column(name = "O_VREME_TRAJANJA")
private Integer vremeTrajanja;
@OneToMany(mappedBy = "operacija")
List<UtrosakProizvodnje> utrosciProizvodnje;
}
with OpercaijaId class:
package com.example.proizvodnja_mleka_backend.model.id;
import com.example.proizvodnja_mleka_backend.model.Sastavnica;
import com.example.proizvodnja_mleka_backend.model.TehnoloskiPostupak;
import java.io.Serializable;
public class OperacijaId implements Serializable {
private Sastavnica sastavnica;
private TehnoloskiPostupak tehnoloskiPostupak;
private Integer operacijaId;
}
and that works fine. But problem is when I refer object Operacija in class UtrosakProizvodnje:
package com.example.proizvodnja_mleka_backend.model;
import com.example.proizvodnja_mleka_backend.model.id.CinilacPoslovanjaId;
import com.example.proizvodnja_mleka_backend.model.id.UtrosakProizvodnjeId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@IdClass(value = UtrosakProizvodnjeId.class)
@Table(name = "UTROSAK_PROIZVODNJE")
public class UtrosakProizvodnje implements Serializable {
@Id
@ManyToOne(optional=false)
@JoinColumns({
@JoinColumn(name="CINILAC_PROIZVODNJE_TC_ID", referencedColumnName="TC_ID", insertable=false, updatable=false),
@JoinColumn(name="CINILAC_PROIZVODNJE_CP_ID", referencedColumnName="CP_ID", insertable=false, updatable=false)
})
private CinilacPoslovanja cinilacPoslovanja;
@Id
@ManyToOne(optional=false)
@JoinColumns({
@JoinColumn(name="PROIZVOD_TC_ID", referencedColumnName="PROIZVOD_TC_ID", insertable=false, updatable=false),
@JoinColumn(name="PROIZVOD_CP_ID", referencedColumnName="PROIZVOD_CP_ID", insertable=false, updatable=false),
@JoinColumn(name="SASTAVNICA_DEO_TC_ID", referencedColumnName="SASTAVNICA_DEO_TC_ID", insertable=false, updatable=false),
@JoinColumn(name="SASTAVNICA_DEO_CP_ID", referencedColumnName="SASTAVNICA_DEO_CP_ID", insertable=false, updatable=false),
@JoinColumn(name="TP_ID", referencedColumnName="TP_ID", insertable=false, updatable=false),
@JoinColumn(name="TEP_ID", referencedColumnName="TEP_ID", insertable=false, updatable=false),
@JoinColumn(name="O_ID", referencedColumnName="O_ID", insertable=false, updatable=false)
})
private Operacija operacija;
@Column(name = "UP_KOLICINA")
private double kolicina;
}
which has an ID class too:
package com.example.proizvodnja_mleka_backend.model.id;
import com.example.proizvodnja_mleka_backend.model.CinilacPoslovanja;
import com.example.proizvodnja_mleka_backend.model.Operacija;
import java.io.Serializable;
public class UtrosakProizvodnjeId implements Serializable {
private Operacija operacija;
private CinilacPoslovanja cinilacPoslovanja;
}
and the problem is when I start springboot app, I get error:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: property mapping has wrong number of columns: com.example.proizvodnja_mleka_backend.model.UtrosakProizvodnje._identifierMapper type: component[cinilacPoslovanja,operacija]
I think the problem is in columns 'PROIZVOD_TC_ID' and 'PROIZVOD_CP_ID'(because when i try to map this without Operacija or CinilacPoslovanja ie. to have just one foreign key with these columns, it works), but I don't know how to solve this example.Is it possible to solve this problem or I need to use some other solutions(e.g. only one id field for UtrosakProizvodnje)?