|
|
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
структура таблиц : 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) : -обычнно через циклы; - как удалять каскадом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2016, 20:57 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
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" удалятся при удалении "папки" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2016, 11:01 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
bochkov, все перепробовал. результат тот же. я чего-то не делаю при добавлении записей пример : в таблице Master одна запись. подготавливаю запись для Insert в Detail Код: java 1. добавляю ее в коллекцию в мастер Код: java 1. и делаю Insert в Detail Код: java 1. (в таком же виде можно сделать Insert несколъких записей в Detail, соотв. добавивши их в коллекцию Master) после этого делаю флеш обеих Entity в базе: Код: java 1. 2. вроде бы достаточно чтоб актуализировать все. но при попытке пробежать по Detail таблице и удалить все записи получаю пустой цикл- коллекция не актуализиована. если включаю каскад, то удалять коллекцию нет смысла. надо удалять мастер-запись -> получаю Exception FK-Violation конечно пытался в подобном варианте удалять и коллекцию с Detail. перезапускаю приложение- все удаляется . и с каскадом и без: коллекция мастера корректно заполнена. ..add и flush() недостаточно, надо как то еще актуализировать базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2016, 16:34 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
Зачем 3 EJB бина, почему все в одном не делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 09:21 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
я месяц всего с этим всем балуюсь. показали как надо делать через AbstractFacade. В таком варианте EntityManager скрыт. доступ ведется через интерфейс к каждой Entity (Таблице в базе). Фактически для каждой Entity свой Entitymanager, соотв свой Bean. хорошо это или плохо пока сказать не могу. альтернатива в виде примера приветствуется.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 10:41 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
почитайте hibernate in action (2011 год по моему). хотя бы пол книги. сразу придет понимание как с этим работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 10:49 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
Penkov Vladimirпочитайте hibernate in action (2011 год по моему). хотя бы пол книги. сразу придет понимание как с этим работать. благодарю за совет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 11:00 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
вот. только открыл pdf, указанной книжки, но совсем не читал его, только проскроллил.. и пришло "озарение". надо оказывается метд edit вызвать с каждой измененной Bean перед flush(). тогда все работает. т.е. insert и delete проходит без перезагрузки: Код: java 1. 2. 3. 4. 5. 6. 7. это равносилъно если делать без фасадов следующему: Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 11:31 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
вам важно понять как работает хибер изнутри. что такое транзакция и какого вида бывают сущности по отношению к транзакции. flush() вызывать не надо, если есть внешний transaction manager. если его нет, нужно добавить (гуглите как это сделать в спринге, там пара строк + spring instrumentation). вообще EntityManager нужен только для загрузки сущностей и insert. все остальные методы надо вызывать трижды перед этим подумав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:10 |
|
||
|
Oбьясните как удалять записи в EJB приложении с Java Persistence API?
|
|||
|---|---|---|---|
|
#18+
Penkov Vladimir, ок, спасибо. мне щас надо набросать проект который я перетягиваю с дельфи в Vaadin. в него входит Spreadsheet и несколько таблиц с mssql. понимать как все работает приходится как всегда по ходу действий. а потом дочитывать все с осознанием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2016, 12:27 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=98&tid=2124131]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
35ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 315ms |

| 0 / 0 |
