Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPA дублирование при сохранении 
:(
    Опции темы
Temdegon
Дата 11.6.2010, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Есть древовидная структура классов из групп и элементов.
Абстрактный класс элемента:
Код

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class MenuItem implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;
    protected String name;
    @ManyToOne(targetEntity = MenuGroup.class, cascade = CascadeType.ALL)
    protected MenuGroup menuGroup;
    protected Integer itemSeq = 0;


Конкретный элемент (конечный)
Код

@Entity
public class Dish extends MenuItem {
    private Double price;


Класс группы:
Код

@Entity
public class MenuGroup extends MenuItem{
    private Boolean isRoot;

    @OneToMany(fetch=FetchType.EAGER)
    private Collection<MenuItem> dishes = new ArrayList();


Группа содержит коллекцию элементов. Каждый элемент держит ссылку на свою группу.
Через EntityManager я загружаю корневой элемент
Код

em.createQuery("SELECT m FROM MenuGroup m WHERE m.isRoot = true")

а он каскадно инициализирует всю структуру. Все это отлично работает на GlassFish V2.

Теперь собственно о проблеме:
Возникла необходимость разрешить автономную работу клиента. Нужно синхронизировать эту структуру данных между серверной базой и локально БД клиентского приложения.
Создаю локальный EntityManager:
Код

        try {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("BankService");
            em = emf.createEntityManager();
        } catch (Exception e) {
            log.info("Local DB Problem");
            e.printStackTrace();
            //prepareDB();
        }
.....
Загружаю корневой элемент с сервера в переменную root
сохраняю в локальном менеджере (база пустая)
        EntityTransaction t = em.getTransaction();
        t.begin();
        em.merge(root);
        t.commit();

И вся структура сохраняется в локальной базе.
Но в этой локальной базе откуда-то появляются дубликаты.
База сервера:
user posted image
Локальная база:
user posted image
Как видно, все сохранилось, но некоторые элементы продублировались. Из-за чего это может быть? Как с этим бороться?
Вопрос №2:
Если я еще раз запущу клиента, то он вставит все записи еще раз, а не обновит существующие. Можно ли как-то "научить" EntityManager вставлять только новые записи и апдейтить измененные, а не вставлять дубликаты?

PM MAIL   Вверх
Temdegon
Дата 14.6.2010, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Изменил
@GeneratedValue(strategy = GenerationType.IDENTITY)
на
@GeneratedValue(strategy = GenerationType.AUTO)
и все стало отлично.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.