powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Oбьясните как удалять записи в EJB приложении с Java Persistence API?
10 сообщений из 10, страница 1 из 1
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223199
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
структура таблиц : A(Master)->B(Details) ; B(Master)->C(Details) :

проблема : не понял еще как удалять записи с таблиц которые связаны между собой через PK-FK.

Таблица "A" - Мастер для Таблицы "B".
Кликаю на таблице "A" -получаю Item, вставляю его в Таблицу "B".
Primary ключ с Таблицы "A" идет в запись таблицы "B".
потом в цикле вставляю несколько записей в Таблицу "C".
Таблица "B" - Мастер для Таблицы "C".
в Каждую запись в Таблице "C" идет соответствующий ключ с Таблицы "B".

Все что нужно - удалить все только что вставленное одним кликом.

Выделяю тот же Item в Таблице "A", кликаю кнопку на удаление.
сначала удаляются записи с таблицы "C" как коллекция с Таблицы "B".
Потом удаляется соответствующая запись с Таблицы "B".
Все проходит но только после перезапуска приложения.
Если попытаться удалить сразу после Insert то самая "нижняя" таблица "C" "проскакивает",
потому что коллекця таблицы "B" с записями с Таблицы "C" - пустая. потом идет попытка удалить запись с таблицы "B" и соответственно Exception.
если перезапустить приложение то коллекция таблицы "B" заполнена и удаление происходит корректно.

вырезки с Entyty‘s:


TEntityTableA
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 36)
@Column(name = "Table_A_ID")
private String table_A_ID;

@OneToMany(mappedBy = "table_A_ID")
private Collection<TEntityTableB> tEntityTableBCollection;
-----------------------------------------------------------------------------
TEntityTableB
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 36)
@Column(name = "Table_B_ID")
private String table_B_ID;

@JoinColumn(name = "Table_A_ID", referencedColumnName = "Table_A_ID")
@ManyToOne
private TEntityTableA table_A_ID;

@OneToMany(mappedBy = "table_B_ID")
private Collection<TEntityTableB> tEntityTableCCollection;
------------------------------------------------------------------------------------------
TEntityTableC
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 36)
@Column(name = "Table_C_ID")
private String table_B_ID;
@Size(max = 25)
@Column(name = "Cell")
private String cell;
@JoinColumn (name = "Table_B_ID", referencedColumnName = "Table_B_ID")
@ManyToOne
private TEntityTableB table_B_ID;



схема добавления и удаления записей :


// Entities-Injection fort 3 Tables

@EJB
TableB_Bean_IF TableB_Bean;
@EJB
TableA_Bean_IF TableA_Bean;
@EJB
TableC_Bean_IF TableC_Bean;
//---------------------------------------------------------------------

//INSERT

//create Record in Table B with selected PK from Table A : Table A is master for Table B
// Create Record in Table C with selected PK from Table B : Table B is Master for Table A

container_Table_A = new BeanItemContainer<TEntityTableA>(TEntityTableA.class, getallRecordsTableA) //container for all records from Table A
Item_Table_A = containerTableA.getItem(event.getItemId()); // Current Item from Table A from Click-Event

TEntityTableB Insert_NewRec_Table_B = new TEntityTableB(); //prepearing Insert for Table B
Insert_NewRec_Table_B.set_TableA_ID(ItemTableA.getBean()); // Primary Key from Table A to Table B as FK
TableB_Bean.create(Insert_NewRec_Table_B); //Insert to Talbe B
Item_Table_A.getBean().get_RecodsCollection_for_Table_B().add(Insert_NewRec_Table_B); //Inserted Item to collection of Records from Table B in Table A


//for (TKeywordsTable key : getallkeys) { //some loop for insert

TEntityTableC Insert_NewRec_Table_C = new TEntityTableC(); //prepearing Insert for Table B

Insert_NewRec_Table_C.set_TableB_ID(Insert_NewRec_Table_B); // Primary Key from Table A to Table B as FK
Insert_NewRec_Table_B.get_RecordsCollection_for_Table_C().add(Insert_NewRec_Table_C); //Inserted Item to collection of Records from Table C in Table B
TableC_Bean.create(Insert_NewRec_Table_C); //Insert to Talbe C

TableC_Bean.flush();
TableB_Bean.flush();
// TableA_Bean.flush();

// }

//----------------------------------------------------------------------------------------------
//DELETE:

try {

if (Item_Table_A != null){
for ( TEntityTableB condit : Item_Table_A.getBean().get_RecordsCollection_for_Table_B()){

for (TEntityTableC kw : condit.get_RecordsCollection_for_Table_C()) {
TableC_Bean.remove(kw);
}
TableC_Bean.getCollection_for_Table_C().clear();
TableB_Bean.remove(condit);
}
}


просьба знающим, обьясните как удалять записи в подобной структуре A(Master)->B(Details) ; B(Master)->C(Details) :
-обычнно через циклы;
- как удалять каскадом.
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223311
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex123F,
быть может про это
автор
Orphan Removal in Relationships

When a target entity in one-to-one or one-to-many relationship is removed from the relationship, it is often desirable to cascade the remove operation to the target entity. Such target entities are considered “orphans,” and the orphanRemoval attribute can be used to specify that orphaned entities should be removed. For example, if an order has many line items and one of them is removed from the order, the removed line item is considered an orphan. If orphanRemoval is set to true, the line item entity will be deleted when the line item is removed from the order.

The orphanRemoval attribute in @OneToMany and @oneToOne takes a Boolean value and is by default false.

The following example will cascade the remove operation to the orphaned customer entity when it is removed from the relationship:

@OneToMany(mappedBy="customer", orphanRemoval="true")
public List<Order> getOrders() { ... }


детки связанные с orphanRemoval="true" удалятся при удалении "папки"
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223391
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bochkov,

все перепробовал. результат тот же.

я чего-то не делаю при добавлении записей

пример : в таблице Master одна запись.
подготавливаю запись для Insert в Detail
Код: java
1.
Insert_NewRec_Table_C.set_TableB_ID(Insert_NewRec_Table_B)


добавляю ее в коллекцию в мастер
Код: java
1.
Insert_NewRec_Table_B.get_RecordsCollection_for_Table_C().add(Insert_NewRec_Table_C); 



и делаю Insert в Detail
Код: java
1.
TableC_Bean.create(Insert_NewRec_Table_C); 


(в таком же виде можно сделать Insert несколъких записей в Detail, соотв. добавивши их в коллекцию Master)

после этого делаю флеш обеих Entity в базе:

Код: java
1.
2.
TableC_Bean.flush();
TableB_Bean.flush();



вроде бы достаточно чтоб актуализировать все.
но при попытке пробежать по Detail таблице и удалить все записи получаю пустой цикл- коллекция не актуализиована.
если включаю каскад, то удалять коллекцию нет смысла. надо удалять мастер-запись -> получаю Exception FK-Violation
конечно пытался в подобном варианте удалять и коллекцию с Detail.

перезапускаю приложение- все удаляется . и с каскадом и без: коллекция мастера корректно заполнена.
..add и flush() недостаточно, надо как то еще актуализировать базу.
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223556
olegeos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем 3 EJB бина, почему все в одном не делается?
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223644
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я месяц всего с этим всем балуюсь.
показали как надо делать через AbstractFacade.
В таком варианте EntityManager скрыт.
доступ ведется через интерфейс к каждой Entity (Таблице в базе).
Фактически для каждой Entity свой Entitymanager, соотв свой Bean.
хорошо это или плохо пока сказать не могу.
альтернатива в виде примера приветствуется..
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223656
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почитайте hibernate in action (2011 год по моему). хотя бы пол книги. сразу придет понимание как с этим работать.
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223667
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Penkov Vladimirпочитайте hibernate in action (2011 год по моему). хотя бы пол книги. сразу придет понимание как с этим работать.

благодарю за совет.
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223698
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот. только открыл pdf, указанной книжки, но совсем не читал его, только проскроллил.. и пришло "озарение". надо оказывается метд edit вызвать с каждой измененной Bean перед flush().
тогда все работает. т.е. insert и delete проходит без перезагрузки:

Код: java
1.
2.
3.
4.
5.
6.
7.
Insert_NewRec_Table_B.get_RecordsCollection_for_Table_C().add(Insert_NewRec_Table_C)
TableC_Bean.create(Insert_NewRec_Table_C);
TableB_Bean.edit(Insert_NewRec_Table_B));
TableC_Bean.edit(Insert_NewRec_Table_C));

TableB_Bean.flush();
TableC_Bean.flush();



это равносилъно если делать без фасадов следующему:

Код: java
1.
2.
3.
4.
EntityManager em;
em.persist(Insert_NewRec_Table_C);
em.persist(Insert_NewRec_Table_B);
em.flush();
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223732
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вам важно понять как работает хибер изнутри. что такое транзакция и какого вида бывают сущности по отношению к транзакции.
flush() вызывать не надо, если есть внешний transaction manager. если его нет, нужно добавить (гуглите как это сделать в спринге, там пара строк + spring instrumentation).

вообще EntityManager нужен только для загрузки сущностей и insert. все остальные методы надо вызывать трижды перед этим подумав.
...
Рейтинг: 0 / 0
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
    #39223749
Фотография Alex123F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Penkov Vladimir,

ок, спасибо.
мне щас надо набросать проект который я перетягиваю с дельфи в Vaadin.
в него входит Spreadsheet и несколько таблиц с mssql.
понимать как все работает приходится как всегда по ходу действий. а потом дочитывать все с осознанием.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Oбьясните как удалять записи в EJB приложении с Java Persistence API?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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