es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mapeo de muchos a uno para dos tablas hacia una entidad única.

Clase A{
    private int campid;
    private string name;
}

Clase B {
    private int campid;
    private string name;
}

Clase combo{
    private int id;
    private string phonenumber;
}

Estoy intentando hacerlo de esta manera

Clase A{
    private int campid;
    private string name;
    @OneToMany(targetEntity = Combo.class, mappedBy ="a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Combo combo;
}

Clase B {
    private int campid;
    private string name;
    @OneToMany(targetEntity = Combo.class, mappedBy = "b", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Combo combo;
}

Clase combo{
    private int id;
    private string phonenumber;
    @ManyToOne
    @JoinColumn(name = "CampIdfk", insertable = true, updatable = true)
    private A a;

    @ManyToOne
    @JoinColumn(name = "CampIdfk", insertable = true, updatable = true)
    private B b;
}

Quiero almacenar el campid de la clase A y el campid de la clase B como clave externa en la tabla combo. Un campid puede tener varios números de teléfono.

Quiero hacer esto en Spring JPA, no entiendo cómo hacerlo.
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto con Spring JPA, puedes mapear la relación entre las clases A y B con la clase Combo utilizando la anotación @ManyToOne. Combo debe tener dos relaciones @ManyToOne con A y B. Aquí tienes un ejemplo:

    @Entity
    public class A {
        @Id
        private int campid;
        private String name;
    
        @OneToMany(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        private List<combo> combos = new ArrayList<>();
    
        // getters and setters
    }
    
    @Entity
    public class B {
        @Id
        private int campid;
        private String name;
    
        @OneToMany(mappedBy = "b", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        private List<combo> combos = new ArrayList<>();
    
        // getters and setters
    }
    
    @Entity
    public class Combo {
        @Id
        private int id;
        private String phonenumber;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "a_campid")
        private A a;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "b_campid")
        private B b;
    
        // getters and setters
    }
    

    En este ejemplo, Combo tiene dos claves foráneas a_campid y b_campid que hacen referencia a las claves primarias de A y B, respectivamente. Ten en cuenta que la anotación @JoinColumn especifica el nombre de la columna de la clave foránea.

    Con este mapeo, puedes crear entidades Combo que pertenezcan tanto a A como a B:

    “`java
    A a = new A();
    a.setCampid(1);
    a.setName(“Camp A”);

    B b = new B();
    b.setCampid(2);
    b.setName(“Camp B”);

    Combo combo1 = new Combo();
    combo1.setId(1);
    combo1.setPhonenumber(“1234567890”);
    combo1.setA(a);

    Combo combo2 = new Combo();
    combo2.setId(2);
    combo2.setPhonenumber(“0987654321”);
    combo2.setB(b);

    a.getCombos().add(combo1);
    b.getCombos().add(combo2);

    repository.save(a);
    repository.save(b);
    “`

Comments are closed.