powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA2 удаление и обновление данных при связи 1-многим
14 сообщений из 14, страница 1 из 1
JPA2 удаление и обновление данных при связи 1-многим
    #38041864
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усть 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
JPA2 удаление и обновление данных при связи 1-многим
    #38041868
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808,

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

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


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

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

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

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

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



Что в данном примере дает его установка?
...
Рейтинг: 0 / 0
JPA2 удаление и обновление данных при связи 1-многим
    #38041930
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JPA2 удаление и обновление данных при связи 1-многим
    #38041933
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё:
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
JPA2 удаление и обновление данных при связи 1-многим
    #38041962
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
alex2808Кстати, а не подскажите как гуру, принцип работы orphanRemoval?
Что в данном примере дает его установка?
При удалении Employee будут удаляться всего его адреса. Это логично, если Адресс это личная инфа принадлежащая исключительно данному Employee.
А вот если у нас адрес это независимая сущность, например словарь, на которые ссылаются разные другие таблицы, то orphanRemoval не нужен.
Чем же он тогда отличается от
cascade = CascadeType.ALL
...
Рейтинг: 0 / 0
JPA2 удаление и обновление данных при связи 1-многим
    #38041988
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JPA2 удаление и обновление данных при связи 1-многим
    #38041995
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем же он тогда отличается от
cascade = CascadeType.ALL

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

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


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


?
...
Рейтинг: 0 / 0
JPA2 удаление и обновление данных при связи 1-многим
    #38042005
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
JPA2 удаление и обновление данных при связи 1-многим
    #38042052
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808,
Чё там думать. У темя 3 таблицы и отношения много ко много по бизнесу. Так?
Из этого и исходи.
Тогда в подчинённойВсегда надо удалять по каскаду от обоих родителей. Плюс записи в самой подчиненной тоже можно.
У тебя СТАНДАРТНЫЙ маппинг.
...
Рейтинг: 0 / 0
JPA2 удаление и обновление данных при связи 1-многим
    #38042058
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808,
должно быть так, я не проверял. А еще какая-нить сущность кроме владельца коллекции может ссылаться на ее элементы? Если нет, то можно без орфана, просто как коллекцию элементов замапить.
...
Рейтинг: 0 / 0
JPA2 удаление и обновление данных при связи 1-многим
    #38042580
Фотография peter6636
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808,

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


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