Я сталкиваюсь с некоторыми проблемами, о которых некоторые из вас уже говорили, и извините, что снова обнародовал это.
Как будто я до сих пор не понимаю определённого аспекта 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-кодеров, как вы, так что простите мое невежество, я буду очень рад, если вы сможете пролить немного света на это.
Спасибо за чтение!