Как мне создать это сопоставление многие-к-одному, используя JPA? - PullRequest
3 голосов
/ 22 сентября 2009

Я бы хотел получить следующую схему:

Таблица A:
a_id
(другие столбцы)


Таблица B:
b_id
(другие столбцы)


Таблица C:
c_id
(другие столбцы)


Таблица D:
a_id_fk
b_id_fk
c_id_fk

Я хотел бы знать, как создать сущность D. Все ключи a_id_fk, b_id_fk и c_id_fk в Таблице D образуют составной первичный ключ.

Спасибо

1 Ответ

1 голос
/ 22 сентября 2009

Моделирует троичную ассоциацию. Для того, чтобы использовать его, вам нужна карта. JPA 1.0 не поддерживает Map, поэтому, если вы хотите использовать ее, вам нужен Hibernate, потому что его Map поддерживает. Это что-то вроде

@Entity
public class A {

    @ManyToMany
    @org.hibernate.annotations.MapKeyManyToMany(
        joinColumns=@JoinColumn(name="B_ID")
    )
    @JoinTable(
        name="D",
        joinColumns=@JoinColumn(name="A_ID"),
        inverseJoinColumns=@JoinColumn(name="C_ID")
    )
    private Map<B, C> bAndC = new HashMap<B, C>();

}

Обратите внимание, что каждый ключ - это B, а каждое значение - это объект C. На практике это связывает A и C через сущность B.

@Entity
public class B {

    @Id
    private Integer id;

}

@Entity
public class C {

    @Id
    private Integer id;  

}

Или, если вам не нужна карта, вы можете смоделировать ABC объекта в соответствии с

public class AbC {

    @ManyToOne
    @JoinColumn(name="A_ID", insertable=false, updateable=false)
    private A a;

    @ManyToOne
    @JoinColumn(name="B_ID", insertable=false, updateable=false)
    private B b;

    @ManyToOne
    @JoinColumn(name="C_ID", insertable=false, updateable=false)
    private C c;

    @EmbeddedId
    private A_b_C_i_D id;

    @Embeddable
    public static class A_b_C_i_D implements Serializable {

        @Column(name="A_ID", updateable=false)
        private Integer a_i_d;

        @Column(name="B_ID", updateable=false)
        private Integer b_i_d;

        @Column(name="C_ID", updateable=false)
        private Integer c_i_d;

        // getter's and setter's

        public boolean equals(Object o) {
            if(o == null)
                return false;

            if(!(o instanceof A_b_C_i_D))
                return false;

            A_b_C_i_D other = (A_b_C_i_D) o;
            if(!(getA_i_d().equals(other.getA_i_d()))
                return false;

            if(!(getB_i_d().equals(other.getB_i_d()))
                return false;

            if(!(getC_i_d().equals(other.getC_i_d()))
                return false;

            return true;
        }

        public int hashcode() {
            // hashcode implementation
        }

    }

}

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...