powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Мэппинг для однонаправленной связи
25 сообщений из 48, страница 1 из 2
Мэппинг для однонаправленной связи
    #38020864
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две сущности
Например Employer и Phone (пример из Pro JPA 2).
Employee 1 ------------> * Phone
Employe знает про Phone, а Phone про Employe не знает.
Что это собственно значит в понятиях классов?
Что в классе Employee есть List<Phone> phone но в классе Phone нет поля Employee?

Цитата
"There is no join column to store the association back from
Phone to Employee. Therefore, we have used a join table to associate the Phone entity with the Employee
entity."
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38020875
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
да, для соединения используется еще одна таблица, поэтому в классе телефона не нужно поле сотрудник
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38020882
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, спасибо.

такой нюанс. А зачем вообще делать таким образом однонаправленную связь - не то же самое получиться, если например сделать обычный мэппинг с @OneToMany(mappedBy = "employee"), то есть у Phone будет поле employee, но просто оставить его приватным,
то есть никаких setEmploye()/getEmployee(). Разве не то же самое получиться? В чем будет отличие?
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38020905
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oson,
ну во первых, обычный мэппинг, как вы его называете:@OneToMany(mappedBy = "employee") не такой уж и обычный. Это скорее отсутствие мэппинга. Хибернейт не понимает двунаправленных связей. mappedBy это указание, чтобы он не создавал вторую связь Employe-Phone. Потому что она уже замаплена в Phone. Если вам нужны телефоны в классе сотрудника, но не нужна ссылка на сотрудника в классе телефон, то в телефоне просто ничего не указывайте про связь с сотрудником, а в сотруднике сделайте так:
Код: java
1.
2.
@OneToMany
@JoinColumn(name = "emp_id")


При этом хибер в таблице телефона создаст колонку emp_id, которая будет использоваться для связи с сотрудником, дополнительную таблицу для связи создавать не будет, и доступа из класса телефона к этому полю тоже не будет. Если я правильно понял, это то что вам надо. Я далеко не гуру Хибернейта, поэтому на истину в последней инстанции не претендую. Есть хороший туториал индуса на ломаном английском, но от этого не менне ценный. Очень рекомендую.
http://www.youtube.com/watch?v=Yv2xctJxE-w&list=PL4AFF701184976B25&feature=plpp_play_all
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38020909
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckeroson,
ну во первых, обычный мэппинг, как вы его называете:@OneToMany(mappedBy = "employee") не такой уж и обычный. Это скорее отсутствие мэппинга. Хибернейт не понимает двунаправленных связей. mappedBy это указание, чтобы он не создавал вторую связь Employe-Phone. Потому что она уже замаплена в Phone. Если вам нужны телефоны в классе сотрудника, но не нужна ссылка на сотрудника в классе телефон, то в телефоне просто ничего не указывайте про связь с сотрудником, а в сотруднике сделайте так:
Код: java
1.
2.
@OneToMany
@JoinColumn(name = "emp_id")



При этом хибер в таблице телефона создаст колонку emp_id, которая будет использоваться для связи с сотрудником, дополнительную таблицу для связи создавать не будет, и доступа из класса телефона к этому полю тоже не будет. Если я правильно понял, это то что вам надо. Я далеко не гуру Хибернейта, поэтому на истину в последней инстанции не претендую. Есть хороший туториал индуса на ломаном английском, но от этого не менне ценный. Очень рекомендую.
http://www.youtube.com/watch?v=Yv2xctJxE-w&list=PL4AFF701184976B25&feature=plpp_play_all
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021187
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonEmployee 1 ------------> * Phone

такая связь обозначает подчинённую таблицу с телефонами с каскадным удалением оных при удалении сотрудника (обычно по смыслу и БЛ)

Код: java
1.
2.
3.
4.
5.
6.
7.
public class Book {
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "id_book", targetEntity = Comment.class)
	private List<Comment> comments;
	
public class Comment {
  @ManyToOne()
  private Book id_book;



в РСУБД

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table Book (
        id  bigserial not null,
        Name varchar(255) not null,

        primary key (id)
    )

    create table Comment (
        id  bigserial not null,
        id_book_id int8,
        MyName varchar(255) not null,

        primary key (id)
    )

    alter table Comment 
        add constraint FK9BDE863FC891AF2 
        foreign key (id_book_id) references Book



т.е. конечная цель маппинга - получить или "договориться" с РСУБД на такие таблицы с данными и связями\действиями (как каскад)
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021230
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, ТС хотел чтобы phone не знал об employe, поэтому @ManyToOne не надо, ну и mappedBy соответственно тоже.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021246
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerPetro123, ТС хотел чтобы phone не знал об employe, поэтому @ManyToOne не надо, ну и mappedBy соответственно тоже.
мне интересен этот вариант. Он жизненнен вообще?
Распиши классы и, главное! - SQL DDL
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021297
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
классы:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class Book {
   @Id
   private Long id;

   @OneToMany()
   @JoinColumn(name = "book_id")
   private List<Comment> comments;
	
public class Comment {
  @Id
  private Long id;
  }



DDL:

book
id (PK)

comment
id (PK)
book_id (FK->book.id)
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021308
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Он жизненнен вообще?да, с небольшими поправками )
redhat, например, не рекомендует
jpa1, например, такое не рекомендует
мир делится в этом смысле на две части - первая не рекомендует, вторая недоумевает, почему первая не рекомендует

ps я во второй )
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021324
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,
вот смотри какая штука.
Твой вариант, действительно есть в маппинге и жизни (их всего 2).
Но, ситуация кардинально меняется отношением к таблице Комментарии (Телефоны).
Она из подчинённой, удаляемой по каскаду вместе с сотрудником, стала главной и неудаляемой.
А книжка или сотрудник стали справочной таблицей к этой по FK.
Это кардинальное различие в двух маппингах и моделях жизненных ситуаций.

По ТС я вижу, что телефоны надо удалять, значит каскад, значит IMHO мой вариант выше.
ЗЫ.
В access субд )))) есть понятие подчинённая таблица с каскадом и справочная с FK.
В других СУБД по другому называется.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021327
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.net,

я считаю, что РСУБД главнее хибера))
Поэтому я вообще тут отдельно)))
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021328
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.net,

ну вообще такая связь, когда коммент однозначно имеет смысл только для какой-то одной книги и без нее существовать не может, или аналогично с сотрудниками - телефонами, проще реализуется коллекцией.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Entity
public class Book {
   @Id
   private Long id;

   @ElementCollection
   private List<Comment> comments;

@Embedded	
public class Comment {
   private String cmnt;
  }
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021335
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, ну тут каскад никто не мешает поставить
Код: java
1.
2.
3.
   @OneToMany(cascade...)
   @JoinColumn(name = "book_id" )
   private List<Comment> comments;
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021340
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerкогда коммент однозначно имеет смысл только для какой-то одной книгиэто 1 к 1 и оффтоп
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021345
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerPetro123, ну тут каскад никто не мешает поставить
Код: java
1.
2.
3.
   @OneToMany(cascade...)
   @JoinColumn(name = "book_id" )
   private List<Comment> comments;


тогда не понял разницы, если DDL твой и мой одинаков.
Кстати, проверь - работает каскад?

Я про то что есть 2 варианта бизнес-логики и маппинга
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021363
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
это 1 к 1 и оффтоп Не один к одному, а один ко многим. Одна книга - много коментов. Но каждый комент имеет смысл только для одной книги, его нельзя присобачить к другой и он не может существовать отдельно от книги. Тогда нужно использовать коллецию элементов и не делать комент самостоятельной сущностью.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021385
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerPetro123,
это 1 к 1 и оффтоп Не один к одному, а один ко многим.
Одна книга - много коментов. Но каждый комент имеет смысл только для одной книги, его нельзя присобачить к другой и он не может существовать отдельно от книги. Тогда нужно использовать коллецию элементов и не делать комент самостоятельной сущностью.
хорошо бы привести DDL но мы утонем в данном случае. Часто для телефона удобнее именно сущность и отдельная таблица.
Поэтому IMHO Embedded лучше не рассматривать.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021446
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
мы запутались в терминологии. Щас перефразирую. Если использовать для телефонов коллекцию эмбед элементов, то с точки зрения приложения это все равно сущность - такой же класс как и был. С точки зрения базы - это отдельная таблица, не имеющая в общем случае суррогатного первичного ключа и имеющая фк на сотрудника. То есть хибер не позволит выбрать из базы телефоны и сохранить их туда отдельно. Только вместе с сотрудником, которому они принадлежат. Таким образом, весь жизненный цикл телефона полностью контролирует сотрудник. Удаляем сотрудника - удаляются телефоны. Никаких каскадов руками писать не нужно, никакие другие классы не могут иметь ссылку на телефон. Думаю, что это правильно. Щас поэкскрементирую и выложу результаты каскада и ддл для всего этого добра.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021472
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,
ок. Только давай тогда 3 варианта и так как выложил я (классы-dll-пример заполнения БД - хинт таблица для форума)

1. Мой вариант (главная-Сотрудник с каскадом)

2. вариант СПРАВОЧНИК (главная табла -Телефонный справочник без удаления). FK только для целостности и допускаются висящие телефоны без сотрудников.

3. Embedded

Это разные варианты именно по бизнесу от БА
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021482
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
что это?
хинт таблица для форума
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021499
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,

HTML табличка с примерами данныз в БД для ТС женского пола))
типа такой
Заголовок#IDjavapecker
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021505
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,
У меня просто скрин был. Поэтому я привёл скрин.
Удачи!
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021574
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

вариант СПРАВОЧНИК (главная табла -Телефонный справочник без удаления). FK только для целостности и допускаются висящие телефоны без сотрудников. Я не понимаю зачем так извращен этот вариант. Он от первого ничем не отличается, кроме того, что телефон не знает ничего о сотруднике. Висячие телефоны прекрасно работают и в первом варианте и в этом. Каскад работает как в первом так и во втором варианте. Не понимаю почему вдруг таблица телефонов стала главной.
...
Рейтинг: 0 / 0
Мэппинг для однонаправленной связи
    #38021652
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerPetro123,

вариант СПРАВОЧНИК (главная табла -Телефонный справочник без удаления). FK только для целостности и допускаются висящие телефоны без сотрудников. Я не понимаю зачем так извращен этот вариант. Он от первого ничем не отличается, кроме того, что телефон не знает ничего о сотруднике. Висячие телефоны прекрасно работают и в первом варианте и в этом. Каскад работает как в первом так и во втором варианте. Не понимаю почему вдруг таблица телефонов стала главной.
висячие телефоны в первом варианте НЕ допускаются, т.к. ОНИ НЕ НУЖНЫ БИЗНЕСУ.
Это не справочник городов или улиц. Нафига иметь телефонный номер в БД без сотрудника? Т.е. ничей?
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Мэппинг для однонаправленной связи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]