Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JPA дублирование при сохранении


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

@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();

И вся структура сохраняется в локальной базе.
Но в этой локальной базе откуда-то появляются дубликаты.
База сервера:
http://ipicture.ru/Gallery/Viewfull/414984.html
Локальная база:
http://ipicture.ru/Gallery/Viewfull/414994.html
Как видно, все сохранилось, но некоторые элементы продублировались. Из-за чего это может быть? Как с этим бороться?
Вопрос №2:
Если я еще раз запущу клиента, то он вставит все записи еще раз, а не обновит существующие. Можно ли как-то "научить" EntityManager вставлять только новые записи и апдейтить измененные, а не вставлять дубликаты?

Автор: Temdegon 14.6.2010, 02:55
Изменил
@GeneratedValue(strategy = GenerationType.IDENTITY)
на
@GeneratedValue(strategy = GenerationType.AUTO)
и все стало отлично.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)