Hibernate: геттеры / сеттеры дублируются с помощью EmbeddedIds? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть таблица с тремя столбцами: «A», «B» и «C».Два из этих столбцов (A и B) являются составным первичным ключом для таблицы.Я написал класс Java для этой таблицы, и я использую Hibernate для сопоставления данных в классе с данными в таблице.Я создал другой класс для встроенного (то есть составного) ключа.

Два класса выглядят так:

@Entity
@Table(name="SOME_TABLE", schema="SOME_SCHEMA")
public class Outer {
    private Key key;
    private String a;
    private String b;
    private String c;

    @EmbeddedId
    public Key getId() {
        return this.key;
    }

    // Also a setter for Key...

    @Column(name="A")
    public String getA() {
        return this.a;
    }

    public void setA(final String a) {
        this.a = a;
    }

    // Also setters and getters for B and C.
}

.

@Embeddable
public class Key {
    private String a;
    private String b;

    @Column(name="A")
    public String getA() {
        return this.a;
    }

    public void setA(final String a) {
        this.a = a;
    }

    // Also a getter & setter for B.
}

КажетсяКак и во всех глоссариях документации Hibernate, куда именно должны идти геттеры и сеттеры.Должны ли и Outer, и Key иметь установщики для значений, составляющих составной ключ?Если у меня есть установщик в обоих местах, делает ли Hibernate правильную вещь (т.е. устанавливает значение в Key), если я устанавливаю значение для A в Outer?Должны ли Outer.getA / B () и Outer.setA / B () относиться к классу Key?

Я считаю плохой практикой кодирования иметь установщики в двух местах для одних и тех же данных.Это по меньшей мере двусмысленно.Я надеюсь, что Hibernate установит значения для класса Key для меня, но я хотел бы знать наверняка.Спасибо!

-joe

1 Ответ

1 голос
/ 08 декабря 2011

Я не уверен на 100% с @EmbeddedId, но я думаю, что он должен обрабатываться так же, как обычные @Embedded свойства, поэтому я думаю, что отображение должно быть таким:

@Entity
@Table(name="SOME_TABLE", schema="SOME_SCHEMA")
public class Outer {
    private Key key;
    // no fields a and b here
    private String c;

    @EmbeddedId
    public Key getId() {
        return this.key;
    }

    // Also a setter for Key...

    @Transient
    public String getA() {
        return this.key.getA();
    }

    public void setA(final String a) {
        this.key.setA(a);
    }

    @Transient
    public String getB() {
        return this.key.getB();
    }

    public void setB(final String b) {
        this.key.setB(b);
    }

    // Also setters and getters for C.
}
...