2017-01-10 15 views
0

В настоящее время я работаю с таблицами с несколькими отношениями «один-два-один», и я пытаюсь реализовать их все с помощью Hibernate.Сохранение уникальных данных в цикле для множественных отношений «один-два-один» в hibernate

Например, три таблицы я являюсь:

продукта (идентификатор, PNAME), пользователи (ID, PID, GID, uname), группа (идентификатор, gname)

Группы находится в одном -в-многим с пользователями

Продукт также в связи один-ко-многим с пользователями

Пользователи в многие-к-одному отношения как с продуктом и группой.

Образец данных я получил бы ниже:

Line 0: pname uname gname 
Line 1: Razer Billy admin 
Line 2: Razer Sally admin 
Line 3: Razer Benji admin 
Line 4: Yahoo Molly admin 
... 

Из приведенного выше примера, я хочу, чтобы мой стол продукта, чтобы в конечном итоге только две записи (Razer и Yahoo) с Razer, связанных с тремя записями в таблицу Users и Yahoo, связанную с одной записью в таблице Users.

Я также хочу, чтобы в моей таблице Group была только одна запись («admin»), которая связана с четырьмя элементами в таблице «Пользователи».

До сих пор, когда я получаю новую строку данных, как я могу убедиться, что нет повторяющихся записей не созданы для продукта и таблица группы, а ссылки на существующих там?

Например, если данные в строке 5 является: Razer Jacky админ, как я могу убедиться, что таблица пользователей добавляет новую запись «Jacky» в то время как эта запись связана с записью «Razer» и «администратор» уже создан, а не создает повторяющиеся записи в таблице «Продукт и группа»?

Моя правильно испорчено петля для данных выглядит следующим образом:

// Three lists of same size created, 
// each list is a column of the sample data from above 
// ... 

Set<Users> users = new HashSet<Users>(); 
for(int i = 0; i < plist.size; i++){ 
    Product ptemp = new Product(plist.get(i)); 
    Group gtemp = new Group(glist.get(i)); 
    Users utemp = new Users(ptemp, gtemp, ulist.get(i)); 

    users.add(utemp); 

    ptemp.setUsers(users); 
    gtemp.setUsers(users); 

    session.save(ptemp); 
    session.save(gtemp); 
} 

Спасибо!

ответ

1

Давайте рассмотрим пример, который вы указали. Вы хотите вставить новую строку - Razer Jacky админ

Сво два шага процесс Прежде всего, проверьте, если продукт Razer и группа администратор присутствует в вашей базе данных. Если да, загрузите их, если не создайте для них новые объекты.

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

Надеюсь, это поможет.

+0

Спасибо за ответ. Просто для уточнения, если упорствовать, вы имеете в виду добавление аннотаций спящего режима (каскадное сохранение) как к продукту, так и к группе? По той же логике я могу проверить наличие в базе данных и использование аннотаций спящего режима? – 000000000000000000000

+1

Поскольку вы не уверены, что погодный продукт или группа уже присутствуют в вашей БД. Вы должны явно загрузить их, найдя их. Это невозможно сделать с помощью 'cascade'.Если вы используете Cascade в этом случае, вы получите дубликаты записей в 'product' и' group' – Ubercool

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

  • Нет связанных вопросов^_^