почему существует взаимное однонаправленное отображение? - PullRequest
1 голос
/ 13 марта 2011

Я изучаю спящий режим, и меня смущает однонаправленное отображение один-к-одному.

Например: одна жена на одного мужа и наоборот.

Жена.java:

@Entity
public class Wife {
    private int id;
    private String name;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

Муж. Java:

@Entity
public class Husband {
    private int id;
    private String name;
    private Wife wife;
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    @OneToOne
    @JoinColumn(name="wifeId")
    public Wife getWife() {
        return wife;
    }
}

Это однонаправленное сопоставление (внешний ключ) один-к-одному.

Теперь мой вопрос:

это работает? Как можно убедиться, что у одного мужа может быть только одна жена, при таком подходе может быть, что у одного мужа одна и та же жена.

Нет никаких ограничений между мужем и женой.

Так мне интересно, в чем проблема?

Ответы [ 3 ]

3 голосов
/ 13 марта 2011

Если ваши отношения не являются обязательными (то есть, жена может быть null), Hibernate по умолчанию не создает уникального ограничения на внешний ключ. Однако вы можете сделать это для создания ограничения с помощью @JoinColumn(..., unique = true) (если только вы не используете СУБД, где уникальное ограничение для столбца, допускающего пустые значения, не работает должным образом, например, DB2 или Ingres).

Для обязательных отношений Hibernate автоматически создает уникальное ограничение:

@OneToOne(optional = false)
@JoinColumn(name="wifeId")
public Wife getWife() {
    return wife;
} 

Уникальное ограничение навязывает отношения один-к-одному, потому что требует, чтобы у всех мужей были уникальные wifeId s, поэтому они должны ссылаться на разных жен.

0 голосов
/ 13 марта 2011

JoinColumn в отображении означает столбец в таблице Husband, который содержит идентификатор его жены в таблице Wife. Этот столбец присутствует в таблице мужа, поэтому каждая запись мужа может содержать только один идентификатор в столбце жены, следовательно, может иметь только одну жену. Это, однако, не мешает женщине выйти замуж за другого мужа: D. Вам придется позаботиться об этом самостоятельно. По моему мнению, уникальное ограничение не позволит двум записям в таблице Husband иметь одинаковый motherId, но с точки зрения приложения вы должны выполнить проверку перед добавлением или обновлением объекта мужа.

0 голосов
/ 13 марта 2011

Вы можете быть уверены, что у вас будет только один муж на одну жену, установив уникальное ограничение на столбец womanId. Либо поместите его непосредственно в базу данных, либо, если вы используете hibernate для создания схемы, добавьте атрибут unique="true" к аннотации JoinColumn

...