EJB3 отображается? чье владение или сопоставление? - PullRequest
3 голосов
/ 02 сентября 2010

Привет всем, я задаюсь вопросом: когда я могу использовать mapped, чтобы указать, кто является родителем в отношении «один к одному» или «один ко многим» или «отображение многих ко многим» с примером EJB3 (JPA), у меня есть две таблицы A иB таблица A относится к таблице B, так что я ставлю на карту для чьей таблицы?

Ответы [ 2 ]

6 голосов
/ 03 сентября 2010

когда я могу использовать маппинг, чтобы указать, кто является родителем в отношении один-к-одному или один-ко-многим или отображение многих-многих с помощью EJB3

Отношение можетбыть однонаправленным или двунаправленным.В двунаправленных отношениях вы должны указать сторону-владельца отношения в другом классе с элементом mappedBy.

  • Владение сторона, ответственная за распространение обновления отношения к базе данных.Обычно это сторона с внешним ключом.
  • Сторона обратная отображается на сторону владельца.

Из спецификации JPA 1.0:

2.1.7 Отношения сущностей ...

Отношения могут быть двунаправленными или однонаправленными.Двунаправленное отношение имеет как собственную, так и обратную сторону.Однонаправленные отношения имеют только свою сторону.Сторона-владелец отношения определяет обновления отношения в базе данных, как описано в разделе 3.2.3.

Следующие правила применяются к двунаправленным отношениям:

  • Обратная сторонадвунаправленного отношения должно ссылаться на свою собственную сторону с помощью элемента mappedBy аннотации OneToOne, OneToMany или ManyToMany.Элемент mappedBy обозначает свойство или поле в объекте, являющемся владельцем отношения.
  • Сторона множества двунаправленных отношений один-ко-многим / многие-к-одному должна быть стороной-владельцем,следовательно, элемент mappedBy нельзя указывать в аннотации ManyToOne.
  • Для двунаправленных отношений «один к одному» сторона-владелец соответствует стороне, содержащей соответствующий внешний ключ.
  • Для двунаправленных отношений «многие ко многим» любая сторона может быть стороной-владельцем.

Представьте себе следующую модель:

@Entity
public class Player {
...
    private Team team;

    @ManyToOne
    public Team getTeam() { return team; }

    ...
} 

И

@Entity
public class Team {
    ...    
    private Set<Player> players = new HashSet<Player();

    public Team() { }

    @OneToMany(mappedBy = "team")
    public Set<Player> getPlayers() { return players; }

    ...    
}

В этом примере атрибут mappedBy показывает, что свойство team экземпляра Player отображается на экземпляр Team, а идентификатор объекта Team будет существовать как столбец внешнего ключа в таблице PLAYER.Сторона-владелец Player отвечает за хранение внешнего ключа.

Если mappedBy не используется, поставщик сохраняемости примет два независимых отношения:

2 unidirectional relations

Как правило, это не то, что вам нужно, и может привести к неожиданному поведению (например, вставка дублирующихся строк с множеством ко многим).

Смежные вопросы

Ссылки

  • Спецификация JPA 1.0
    • Раздел 2.1.7 "Связи сущностей"
2 голосов
/ 02 сентября 2010

Атрибут mappedBy можно использовать, когда отношение уже определено в другой части.

Например, в отношениях один к одному между сущностями А и В:

@Entity
public class A {

    @OneToOne
    @JoinColumn
    private B b;

    // Code removed for clarity

}

Здесь мой класс A определяет отношение к B. Это отношение «один к одному» с использованием столбца соединения. Если я хочу, чтобы B связывался с A, используя эту уже определенную связь, чтобы установить двунаправленную связь между моими сущностями, я могу использовать атрибут mappedBy:

@Entity
public class B {

    @OneToOne(mappedBy="b")
    private A a;

    // Code removed for clarity

}

Здесь атрибут mappedBy означает «Я хочу определить отношение« один к одному », которое уже было определено для объекта A, для атрибута с именем« b »».

Как правило, владельцем двунаправленной связи является сущность, сопоставленная с таблицей, содержащей столбец соединения, ссылающийся на другую таблицу. Если вы используете объединяющую таблицу, любая сторона может быть стороной-владельцем, это должно иметь смысл в вашей модели данных.

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