|
|
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Всем привет. Помогите разобраться с такой задачей. Работаю с JPA EclipseLink EJB. Есть две сущности Book и Author, связанные many-to-many. В базе данных таблицы books и authors связаны через join таблицу authors_books по их id. В таблице authors не должно быть дубликатов, т.е. при вставке сущности Book должна производится проверка для авторов. Если автора нет, то добавить его, если есть то не добавлять, а в join table добавить его id. И вот тут непонятно как вклиниться в эту проверку, не разрывая каскадных связей. Как это лучше сделать? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 15:21:47 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe R, ну дак код вставки и сохранения сессии то где? Ты сделай сначала, чтобы они повторялись (запрос и покажи повтор). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 15:50:21 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Petro123Joe R, ну дак код вставки и сохранения сессии то где? Ты сделай сначала, чтобы они повторялись (запрос и покажи повтор). Код вставки я написал: getEntityManager().persist(entity); База MySQL. Поле name для авторов стоит уникальным. При добавлении дубликата вылетает DatabaseException. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:00:44 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RБаза MySQL. Поле name для авторов стоит уникальным. При добавлении дубликата вылетает DatabaseException. При этом authorId имеет значение, или null? Если имеет, то покажите польностью исключение. Если authorId null, то соответсвенно, как ORM узнает, что это сущствующая запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:09:46 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
author_id генерится автоматом, вылетает на имени. FINE: INSERT INTO authors (NAME) VALUES (?) bind => [1 parameter bound] FINE: SELECT 1 WARNING: Local Exception Stack: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Joe Smith' for key 'ind_name' Error Code: 1062 Call: INSERT INTO authors (NAME) VALUES (?) bind => [1 parameter bound] Query: InsertObjectQuery(Joe Smith) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:32:44 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe Rauthor_id генерится автоматом, вылетает на имени. Я спрашиваю про authorId, а не author_id. В момент до вызова em.persist(). Это такой сложный вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:39:29 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Судя по FINE: INSERT INTO authors (NAME) VALUES (?) у вас во время сохранения книги, у автора не проставлен PK. Вот ОРМ и не знает что это существующий автор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:41:46 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Вот код создания сущности: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. authorId я не создаю, он в базе автоинкрементно генерится, это в сущности отображено: Код: java 1. 2. 3. 4. BlazkowiczСудя по FINE: INSERT INTO authors (NAME) VALUES (?) у вас во время сохранения книги, у автора не проставлен PK. Вот ОРМ и не знает что это существующий автор. Вот в этом и вопрос, как этот РК создать то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:54:51 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Вот таким нехитрым способом. Код: java 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 16:55:58 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, findAuthor('Joe Smith') это должен быть query типа?: SELECT c FROM Author c WHERE c.name = 'Joe Smith' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:02:45 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RfindAuthor('Joe Smith') это должен быть query типа?: SELECT c FROM Author c WHERE c.name = 'Joe Smith' Это, уж, как вам удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:06:17 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
А нет, проблема не в том, чтобы найти автора, а в том, чтобы добавить ссылку на него в таблицу authors_books. У меня ведь нет для неё сущности, ORM ведь должен сам разруливать каскадные зависимости. Что тут делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:14:16 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RА нет, проблема не в том, чтобы найти автора, а в том, чтобы добавить ссылку на него в таблицу authors_books. У меня ведь нет для неё сущности, ORM ведь должен сам разруливать каскадные зависимости. Что тут делать? ORM отлично разруливает. Если проблема не в том, а в этом, то объясните это а не то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:17:11 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
В общем задача в следующем: - если автор есть, то не добавлять его в таблицу authors, а добавить на него ссылку в таблицу authors_books, к которой у меня нет доступа. На SQL это выглядело бы так: Код: sql 1. Как это через ORM сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:43:18 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RА нет, проблема не в том, чтобы найти автора, а в том, чтобы добавить ссылку на него в таблицу authors_books. У меня ведь нет для неё сущности, ORM ведь должен сам разруливать каскадные зависимости. Что тут делать? это многопользовательская система. Представь что 2 чела рядом вводят "Joe Smith" - разные это авторы или один? Т.е. код должен содержать findAuthor либо в Бизнес-слое вверху, либо внизу в сущности-DAO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:44:53 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RВ общем задача в следующем: - если автор есть, то не добавлять его в таблицу authors, а добавить на него ссылку в таблицу authors_books, к которой у меня нет доступа. На SQL это выглядело бы так: Код: sql 1. Как это через ORM сделать? на SQL ты получишь райзе. Т.е. тоже два запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:47:14 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RНа SQL это выглядело бы так: Код: sql 1. Как это через ORM сделать? book.addAuthor(findAuthor(name)); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:57:39 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Joe RВ общем задача в следующем: - если автор есть, то не добавлять его в таблицу authors, а добавить на него ссылку в таблицу authors_books, к которой у меня нет доступа. На SQL это выглядело бы так: Код: sql 1. Как это через ORM сделать?Господи, да что у вас за проблема то? Вам не надо руками ничего добавлять в эту промежуточную таблицу. Вам надо просто добавить в список авторов еще одного автора. Все остальное JPA сделает за вас. Но! Разумеется, вы не можете сделать что-то типа Код: java 1. 2. 3. Ведь в этом случае, будет создан новый автор, а судя по вот этому исключению: logcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Joe Smith' for key 'ind_nameимена авторов у вас должны быть уникальными. Вам Blazkowicz уже правильно сказал, что вам требуется сделать - вместо создания нового автора, сначала производить поиск сущеуствующего. То есть надо делать что-то типа (псведокод): Код: java 1. 2. 3. 4. 5. 6. 7. Если ваши маппинги прописаны верно, то такой вариант отработает на ура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 17:59:40 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
svenomТо есть надо делать что-то типа (псведокод): Персистить, автора при создании, не обязательно, если каскада прописаны. Само добавит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 18:03:55 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Разобрался, сделал findAuthorByName и заработало. Всем спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 21:37:55 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
Кстати, никогд ане понимал почему findAuthorByName(String name) может быть лучше чем findAuthor(String name) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 22:21:52 |
|
||
|
JPA EclipseLink cascade CRUD
|
|||
|---|---|---|---|
|
#18+
авторКстати, никогд ане понимал почему findAuthorByName(String name) может быть лучше чем findAuthor(String name) А если есть потребность в findAuthorByBookName(String bookName) или findAuthorByBookISDN(String ISDN)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2012, 23:09:51 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37661999&tid=2132570]: |
0ms |
get settings: |
19ms |
get forum list: |
27ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
68ms |
get topic data: |
19ms |
get forum data: |
6ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
| others: | 360ms |
| total: | 611ms |

| 0 / 0 |
