Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA2 удаление и обновление данных при связи 1-многим / 14 сообщений из 14, страница 1 из 1
16.11.2012, 16:46:51
    #38041864
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Усть 3 класса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
@Entity
@Table(name = "Transfer")
public class TransferEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String note;
    private byte typeProcess;
    private String phoneRecipient;
    private String phoneSender;

    @Temporal(value= TemporalType.TIMESTAMP)
    private Date dateCreate;

    @Temporal(value= TemporalType.TIMESTAMP)
    private Date dateChange;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "transfer")
    private Collection<TransferTableEntity> transferTables = new ArrayList<TransferTableEntity>();

    ....
}

@Entity
@Table(name = "TransferTable")
public class TransferTableEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private double qty; //количество
    private double price; //цена
    private double total; //сумма

    @Temporal(value= TemporalType.TIMESTAMP)
    private Date dateCreate;

    @Temporal(value= TemporalType.TIMESTAMP)
    private Date dateChange;

    @ManyToOne
    @JoinColumn(name="product_id")
    private ProductEntity product;

    @ManyToOne
    @JoinColumn(name="transfer_id") 
    private TransferEntity transfer;
  ...
}

@Entity
@Table(name = "Product")

public class ProductEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String idParent;
  
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
    private Collection<TransferTableEntity> transferTables = new ArrayList<TransferTableEntity>();

    ...
}



Класс TransferTableEntity связан отношением многие к одному с ProductEntity и TransferEntity.

Например у меня 3 объекта TransferTableEntity связаны с одним объектом TransferEntity .
Нужно удалить один из объектов TransferTableEntity, чтобы их осталось 2.
Как это сделать?

Выполняю
Код: java
1.
2.
3.
4.
5.
@PersistenceContext(unitName = "B-ejbPU")
    private EntityManager em;

     TransferEntity te = find....;
    em.remove(te);


Все ок. По каскаду удаляет все связанные с ним TransferTableEntity.

А вот как удалить один из TransferTableEntity связанных с TransferEntity?
...
Рейтинг: 0 / 0
16.11.2012, 16:48:57
    #38041868
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
alex2808,

просто в тупую
Код: java
1.
2.
3.
4.
5.
@PersistenceContext(unitName = "B-ejbPU")
    private EntityManager em;

     TransferTableEntity tte = find....;
    em.remove(tte);


не прокатывает, видно связи мешают.
...
Рейтинг: 0 / 0
16.11.2012, 17:01:10
    #38041895
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Есть сто-пицот ошибок по которым может не проихсодить удаление. Вы же тупо пишите "не прокатывает". Ну "не прокатывает", так можно "перенести" или "перекинуть", в конце концов.
Происходит ошибка? Или просто не удаляется из-за кеширования?
А если вот так:
te.getTransferTables().remove(i)
А потом закомитить?
...
Рейтинг: 0 / 0
16.11.2012, 17:13:21
    #38041920
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Blazkowicz,

Ошибок не выдает, просто не удалят.

Сейчас попробую Ваше предложение.

Кстати, а не подскажите как гуру, принцип работы orphanRemoval?

Код: java
1.
2.
3.
4.
5.
6.
7.
@Entity
class Employee {
     :
    @OneToMany(orphanRemoval=true)
    private List<Address> addresses;
     :
}



Что в данном примере дает его установка?
...
Рейтинг: 0 / 0
16.11.2012, 17:20:08
    #38041930
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
alex2808Ошибок не выдает, просто не удалят.

Так и нужно было говорить. Когда "мешают связи" то будет явный SQL Exception. В вашем случае просто удаление сущности не обозначает удаление коллеции:
21.1. A note about collections
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/example-parentchild.html


alex2808Кстати, а не подскажите как гуру, принцип работы orphanRemoval?
Что в данном примере дает его установка?
При удалении Employee будут удаляться всего его адреса. Это логично, если Адресс это личная инфа принадлежащая исключительно данному Employee.
А вот если у нас адрес это независимая сущность, например словарь, на которые ссылаются разные другие таблицы, то orphanRemoval не нужен.
...
Рейтинг: 0 / 0
16.11.2012, 17:22:25
    #38041933
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Вот ещё:
http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache Collections are only invalidated from the cache as a result of an operation on the Java object that represents the collection!

Т.е. если вы иногда работаете независимо с TransferTableEntity, а иногда с коллекцией TransferEntity.transferTables , то нужно аккуратнее следить за кешированием.
...
Рейтинг: 0 / 0
16.11.2012, 17:33:39
    #38041962
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Blazkowicz
alex2808Кстати, а не подскажите как гуру, принцип работы orphanRemoval?
Что в данном примере дает его установка?
При удалении Employee будут удаляться всего его адреса. Это логично, если Адресс это личная инфа принадлежащая исключительно данному Employee.
А вот если у нас адрес это независимая сущность, например словарь, на которые ссылаются разные другие таблицы, то orphanRemoval не нужен.
Чем же он тогда отличается от
cascade = CascadeType.ALL
...
Рейтинг: 0 / 0
16.11.2012, 17:47:25
    #38041988
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Blazkowiczalex2808Ошибок не выдает, просто не удалят.

Так и нужно было говорить. Когда "мешают связи" то будет явный SQL Exception. В вашем случае просто удаление сущности не обозначает удаление коллеции:
21.1. A note about collections
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/example-parentchild.html


А за эту инфу огромное спасибо.
Нормально отработала вот такая конструкция
Код: java
1.
2.
3.
4.
            TransferTableEntity tte = (TransferTableEntity) te.getTransferTables().iterator().next();
            te.getTransferTables().remove(tte);
            em.remove(tte);
            em.flush();
...
Рейтинг: 0 / 0
16.11.2012, 17:49:50
    #38041995
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Чем же он тогда отличается от
cascade = CascadeType.ALL

Каскад потянет за собой элементы коллекции при удалении родительского элемента, а орфан удалит элемент коллекции из базы при удалении его из коллекции. Так же, как работает элемент эмбеддед коллекции. Только в случае эмбеддед коллекции хибер гарантирует, что ссылок на элемент коллекции не может быть в базе, а при орфане это должны обеспечить вы.
...
Рейтинг: 0 / 0
16.11.2012, 17:51:42
    #38041999
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
Кстати, еще, если не затруднит, объясните для новичка плизз различия между

Код: java
1.
em.persist(te);


и
Код: java
1.
em.merge(te);


?
...
Рейтинг: 0 / 0
16.11.2012, 18:00:05
    #38042005
alex2808
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
javapeckerЧем же он тогда отличается от
cascade = CascadeType.ALL

Каскад потянет за собой элементы коллекции при удалении родительского элемента, а орфан удалит элемент коллекции из базы при удалении его из коллекции. Так же, как работает элемент эмбеддед коллекции. Только в случае эмбеддед коллекции хибер гарантирует, что ссылок на элемент коллекции не может быть в базе, а при орфане это должны обеспечить вы.

Т.е.,насколько я понял, если я использую у себя этот параметр анотации в коде
Код: java
1.
2.
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "transfer" orphanRemoval=true)
    private Collection<TransferTableEntity> transferTables = new ArrayList<TransferTableEntity>();



То строка из подчиненной таблицы удалится, если я напишу просто
Код: java
1.
2.
3.
           TransferTableEntity tte = (TransferTableEntity) te.getTransferTables().iterator().next();
            te.getTransferTables().remove(tte);
            em.flush();


а не как ранее
Код: java
1.
2.
3.
4.
            TransferTableEntity tte = (TransferTableEntity) te.getTransferTables().iterator().next();
            te.getTransferTables().remove(tte);
            em.remove(tte);
            em.flush();


?
...
Рейтинг: 0 / 0
16.11.2012, 18:32:02
    #38042052
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
alex2808,
Чё там думать. У темя 3 таблицы и отношения много ко много по бизнесу. Так?
Из этого и исходи.
Тогда в подчинённойВсегда надо удалять по каскаду от обоих родителей. Плюс записи в самой подчиненной тоже можно.
У тебя СТАНДАРТНЫЙ маппинг.
...
Рейтинг: 0 / 0
16.11.2012, 18:34:25
    #38042058
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
alex2808,
должно быть так, я не проверял. А еще какая-нить сущность кроме владельца коллекции может ссылаться на ее элементы? Если нет, то можно без орфана, просто как коллекцию элементов замапить.
...
Рейтинг: 0 / 0
17.11.2012, 16:14:15
    #38042580
peter6636
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JPA2 удаление и обновление данных при связи 1-многим
alex2808,

insert
update
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA2 удаление и обновление данных при связи 1-многим / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]