How to use one column in two foreign keys?

Viewed 155

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)?

0 Answers
Related