|
|
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
у меня есть объект кандидат. У него имеется имя, фамилия, возраст, список вакансий. У меня есть форма на страничке. На ней есть возможность менять имя фамилию и возраст(но не список вакансий). Благодаря возможностям спринга я могу получить частично заполненный объект кандидата(без списка вакансий). теперь я хочу сохранить изменения в БД. Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату, и только потом сохранять кандидата? или есть какой-то более элегантный способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 18:41:13 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90, не надо, просто сохрани и все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 18:57:03 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, просто сохраняю и вакансии стираются в базе данных! это я проверил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:08:33 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
точнее update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:09:08 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90, я могу помедитировать, но я думаю гораздо быстрее получится решить проблему имея код, солидарен? Ты айдишки не перетираешь случаем? или в коллекцию нулл не пихаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:10:10 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90точнее update Как коллекция замаплена? Что показывает хибернейт лог? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:13:07 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, Уже вроде не первый месяц тут. Пора привыкать что если хочешь чтобы тебе помогли - надо задавать конкретные вопросы, приводить лог и обьяснять что не понятно. А философия тут мало кому интересна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:14:33 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
вот код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Код: java 1. 2. 3. 4. 5. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:15:07 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:16:58 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:17:40 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
точнее лог такой: Код: java 1. 2. 3. без delete всё классно было бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:28:46 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Вот это не смущает - private Set<Vacancy> vacancies = new HashSet<Vacancy>(); private Set<Skill> skills = new HashSet<Skill>(); ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:31:22 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, осталось с самого начала, чтобы хоть как-то работало. убрал new - конкретно на расссатриваему тему это никак не влияет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:39:41 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Мне кажется ты что-то не договариваешь. Смотри если оставить так - private Set<Vacancy> vacancies = new HashSet<Vacancy>(); private Set<Skill> skills = new HashSet<Skill>(); то каждый раз когда хибер будет создавать экземпляр твоей сущности будет вызываться этот код, и грубо говоря хибер будет считать что это новое значение - поэтому при апдейте он будет удалять все старые. Если сделать так - private Set<Vacancy> vacancies ; private Set<Skill> skills; public void addVacancy(Vacancy v){ if (vacancies == null) { vacancies = new ... } vacancies.add(v); } то по идее все будет ок, остальные методы по аналогии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 19:44:33 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, Спасибо - верно. Я в одном месте пытался увидеть то, что должно быть в другом месте. хотя, если честно не очень классно, что придется из-за этого теперь везде переписывать добавление в список и добавлять через объемлющий класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 20:03:34 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
начинаю задумываться.... а ведь у меня eager инициализация. почему при сохранении конструктор вызывается, а инициализация - нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 20:06:46 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Тот же самый принцип, но обнуляем коллекциии в самом методе, если знаем, что они не должны обновляться: Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 20:26:01 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
ivanra, а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 22:02:06 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90ivanra, а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ? так принцип тот же, если хибер в коллекции нулл и маппинг лейзи он просто не будет удалять все, считая что они не подгружены. Хотя это конечно больше похоже на воркэраунд, чем на решение, но если все в тиме понимают это - то почему нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 22:14:20 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл никredwhite90ivanra, а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ? так принцип тот же, если хибер в коллекции нулл и маппинг лейзи он просто не будет удалять все, считая что они не подгружены. Хотя это конечно больше похоже на воркэраунд, чем на решение, но если все в тиме понимают это - то почему нет авторFetchType.EAGER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 22:46:57 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, авторто каждый раз когда хибер будет создавать экземпляр твоей сущности будет вызываться этот код, и грубо говоря хибер будет считать что это новое значение - поэтому при апдейте он будет удалять все старые. а когда хибер будет создавать экземпляр моей сущности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 22:50:51 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
На самом деле, обнуление коллекции - это скорее чит. А вот в методе saveCandidate заложена бомба замедленного действия. Предлагаю подумать, что будет, если: - в Candidate добавят новое поле, а на форму забудут - допустим, доступ к записям из таблицы Candidate разделен по пользователям/ролям. Сможет ли технически подкованный пользователь изменить данные в записи, к которой у него нет доступа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 23:55:09 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Правильный способ объявить коллекцию LAZY и не грузить ее если не требуется. В этом случае можно оставить инициализацию полей пустыми коллекциями - они будут использоваться только для новых обьектов, в загруженные из базы Hibernate подставит свои прокси. Меньше гемороя с проверками на null. Если нужно модифицировать дочерние коллекции, то загружать обьекты через fetch join или принудительно инициализировать их в DAO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 02:14:06 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
пролетевший, согласен, просто изначально было решено сделать "попроще", и теперь уже много наверное переделывать придётся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 11:05:21 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
ivanraНа самом деле, обнуление коллекции - это скорее чит. А вот в методе saveCandidate заложена бомба замедленного действия. Предлагаю подумать, что будет, если: - в Candidate добавят новое поле, а на форму забудут - допустим, доступ к записям из таблицы Candidate разделен по пользователям/ролям. Сможет ли технически подкованный пользователь изменить данные в записи, к которой у него нет доступа? 1 - значение просто нельзя поменять будет. хуже будет если начнут переименовывать 2- если не методом гет, то наверное всё хорошо будет! а так да - спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 11:06:54 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
и всё таки может мне кто-нибудь объяснить когда hibernate вызывает конструктор объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 11:08:04 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
ivanraТот же самый принцип, но обнуляем коллекциии в самом методе, если знаем, что они не должны обновляться: Код: java 1. 2. 3. 4. 5. 6. Это не работает - всё также обнуляется. все зависимые таблицы обнулились в базе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 11:21:24 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90и всё таки может мне кто-нибудь объяснить когда hibernate вызывает конструктор объекта? Ну поставь брейкпоинт в конструкторе да посмотри. Короткоий ответ - всегда, когда подгружает из базы. Но если объект есть в кэше - то конструктор вызываться не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 11:46:51 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл ник, авторвсегда, когда подгружает из базы Так где у меня подгрузка из базы то? у меня только загрузка в базу. Но конструктор то вызвался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 12:25:49 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90Так где у меня подгрузка из базы то? у меня только загрузка в базу. Но конструктор то вызвался. автор Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату Если только загрузка, то объект новый = создал, приаттачил все списки - сохранил. Всё это в короткой транзакции этой же сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 13:02:55 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Вот отсюда все проблемы: redwhite90Благодаря возможностям спринга я могу получить частично заполненный объект кандидата(без списка вакансий). Получили объект минуя хибернейт - так и сохраняйте его не в хибернейте. Ну и плюс то, что не показано, но скорее всего, картина такая: - есть объект Candidate(h) в хибернейте - есть Candidate(s0), который инжектится спрингом, какая связь между ними, не видно - опять-таки не видно, сохраняется ли Candidate(s0) в сессии (а если нет, то он конструируется при каждом инжекте, и заполняется значениями из формы. Поэтому, если появятся новые поля - они будут затираться, если их нет на форме; возможна атака в виде подделки скрытого поля ${candidate.id} в post-заросе). - В общем случае, в /saveCandidate это уже 3 объект, назовем его Candidate(s1), и вот он сохраняется в базу Я вижу 2 способа решить проблему: 1) инжектить полный объект Candidate(h) (если хочется сэкономить, списки можно сделать ленивыми); сохранять его в сессию. 2) если не сохранять в сессию, то получать полный объект Candidate(h) в методе saveCandidate и заполнять те поля, которые мы хотим поменять из Candidate(s1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 13:28:52 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
Petro123redwhite90Так где у меня подгрузка из базы то? у меня только загрузка в базу. Но конструктор то вызвался. автор Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату Если только загрузка, то объект новый = создал, приаттачил все списки - сохранил. Всё это в короткой транзакции этой же сессии. update. То есть в базе он уже есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 15:14:06 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
ivanraВот отсюда все проблемы: redwhite90Благодаря возможностям спринга я могу получить частично заполненный объект кандидата(без списка вакансий). Получили объект минуя хибернейт - так и сохраняйте его не в хибернейте. Ну и плюс то, что не показано, но скорее всего, картина такая: - есть объект Candidate(h) в хибернейте - есть Candidate(s0), который инжектится спрингом, какая связь между ними, не видно - опять-таки не видно, сохраняется ли Candidate(s0) в сессии (а если нет, то он конструируется при каждом инжекте, и заполняется значениями из формы. Поэтому, если появятся новые поля - они будут затираться, если их нет на форме; возможна атака в виде подделки скрытого поля ${candidate.id} в post-заросе). - В общем случае, в /saveCandidate это уже 3 объект, назовем его Candidate(s1), и вот он сохраняется в базу Я вижу 2 способа решить проблему: 1) инжектить полный объект Candidate(h) (если хочется сэкономить, списки можно сделать ленивыми); сохранять его в сессию. 2) если не сохранять в сессию, то получать полный объект Candidate(h) в методе saveCandidate и заполнять те поля, которые мы хотим поменять из Candidate(s1) объект получен хибернейтом всё таки изначально. Это что-то типа личного кабинета, где иможно имя, адрес, телефон .... поменять. вызывается метод контроллера, который грузит кандидата соответствующего, сохраняется в request(думаю, что model.addAttribute(?,?) это делает) данные выводятся в текстовых полях формы с возможностью изменения. по кнопке эти данные считываются в новый объект кандидата и пытаются сохраниться. с hidden полем действительно беда получается, но иначе придётся действительно в сессию класть объект) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 15:20:39 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
redwhite90забыл ник, авторвсегда, когда подгружает из базы Так где у меня подгрузка из базы то? у меня только загрузка в базу. Но конструктор то вызвался. ну где же? где? мне правда очень интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:02:18 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
брейкпоинт таки не судьба поставить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:09:34 |
|
||
|
Вопрос по хибернейту
|
|||
|---|---|---|---|
|
#18+
забыл никбрейкпоинт таки не судьба поставить? Как я могу все случаи проверить когда он вызывается? написать все возможные вызовы хибернейтом этого объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 10:10:11 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128805]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 295ms |
| total: | 477ms |

| 0 / 0 |
