многие ко многим (проблема со ссылками на себя) против двойного «один ко многим» - PullRequest
1 голос
/ 18 ноября 2009

Я сталкиваюсь с некоторыми проблемами, о которых некоторые из вас уже говорили, и извините, что снова обнародовал это.

Как будто я до сих пор не понимаю определённого аспекта hibernate. Я использую maven2, hibernate 3.2.5 ga, spring 2.6.5 SEC01, hsqldb 1.8.0.10, netbeans 6.7.1.

Я управляю управлением пользователями и контентом, и мне удалось установить рабочие отношения «многие ко многим» между «контактом» и «групповым pojo» в моей среде с помощью hsql или mysql 5.0.51 но не на локальном тестовом сервере. Из-за этого я хотел бы попробовать двойную связь один-ко-многим, поэтому я бы хотел спросить об этом сопоставлении с введением промежуточной модели.

Теперь вот мои сопоставления (я разместил только необходимое, чтобы избежать длинного поста)

//UserAccount POJO

@OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL})
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Phone> phones = new HashSet<Phone>();

@OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Contact> contacts = new HashSet<Contact>();

@OneToMany(targetEntity=GroupImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Group> groups = new HashSet<Group>();


//Contact POJO

@ManyToOne(targetEntity=UserAccountImpl.class)
@JoinColumn(name="USER_ACCOUNT_ID",nullable=false)
private UserAccount userAccount;

@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL})
private Set<Phone> phones = new HashSet<Phone>();

@ManyToMany(targetEntity=GroupImpl.class, mappedBy="contacts")
private Set<Group> groups=new HashSet<Group>();


//Group  POJO
@ManyToOne(targetEntity=UserAccountImpl.class)
@JoinColumn(name="USER_ACCOUNT_ID",nullable=false)
private UserAccount userAccount;

@ManyToMany(targetEntity=ContactImpl.class,cascade={CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name="GROUP_CONTACT_MAP", joinColumns={@JoinColumn(name="GROUP_ID")},
inverseJoinColumns={@JoinColumn(name="CONTACT_ID")})
private Set<Contact> contacts = new HashSet<Contact>();

ТАК, это прекрасно работает на моей машине с hsqldb и моим локальным mysql, однако это не то же самое для локального сервера тестирования, использующего тот же самый mysql 5.0. Вот мои вопросы:

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

2. Я использую стойкость Мэннинга java с hibernate - замечательную книгу, с которой я начал практиковать использование hibernate. В этой книге, скажем, двойная ассоциация один ко многим в моем случае между контактом и группой с посреднической моделью. Я просто не знаю, как использовать это на практике, потому что я хотел бы перейти на этот подход.

2.1 Итак, мои главные заботы - как получить все контакты в группе и все группы, в которых есть контакт? Я просто не вижу этого ясно.

2.2 Если придерживаться этого подхода, каким будет контакт и группа, ссылающиеся друг на друга? будут игнорировать друг друга? Может быть, это основные вещи для опытных Java-кодеров, как вы, так что простите мое невежество, я буду очень рад, если вы сможете пролить немного света на это.

Спасибо за чтение!

1 Ответ

1 голос
/ 19 ноября 2009

несколько идей:

0: вы уверены, что изменили спящий диалект между использованием hsqldb и mysql?

1: я думаю, вы могли бы ожидать исключения, если бы у вас была неразрешимая / циклическая ссылка

2. **: вы должны создать новый класс с именем ContactToGroup, он будет иметь поле contact и поле group, каждое из которых является one концом многозначного -один. Классы Contact и Group будут иметь набор contactToGroup. Вы можете запросить это как:

from Contact c 
left join fetch c.contactToGroupSet joinTable 
left join fetch joinTable.Group

Это даст вам все контакты с их наборами групп, прикрепленными через объекты ContactToGroup.

совместное создание объектов Contact, ContactToGroup и Group позволит вам выполнять запись и в эти таблицы.

Удачи!

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