powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по хибернейту
37 сообщений из 37, показаны все 2 страниц
Вопрос по хибернейту
    #38365205
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня есть объект кандидат. У него имеется имя, фамилия, возраст, список вакансий.
У меня есть форма на страничке. На ней есть возможность менять имя фамилию и возраст(но не список вакансий). Благодаря возможностям спринга я могу получить частично заполненный объект кандидата(без списка вакансий). теперь я хочу сохранить изменения в БД. Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату, и только потом сохранять кандидата? или есть какой-то более элегантный способ?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365226
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,
не надо, просто сохрани и все
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365248
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

просто сохраняю и вакансии стираются в базе данных! это я проверил.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365250
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее update
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365253
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

я могу помедитировать, но я думаю гораздо быстрее получится решить проблему имея код, солидарен?
Ты айдишки не перетираешь случаем? или в коллекцию нулл не пихаешь?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365256
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90точнее update

Как коллекция замаплена? Что показывает хибернейт лог?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365260
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

Уже вроде не первый месяц тут. Пора привыкать что если хочешь чтобы тебе помогли - надо задавать конкретные вопросы, приводить лог и обьяснять что не понятно. А философия тут мало кому интересна.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365263
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
<form action="saveCandidate">
		name: <input type="text" value="${candidate.name}" name="name" />
		surname: <input type="text" value="${candidate.surname}"name="surname" /> 
		phone: <input type="text"	value="${candidate.phone}" name="phone" /> 
		cv_url: <input type="text"	value="${candidate.resumeUrl}" name="resumeUrl" /> <input
			type="hidden" name="id" value="${candidate.id}"> <input
			type="submit" value="save changes" />
	</form>



Код: java
1.
2.
3.
4.
5.
@RequestMapping("/saveCandidate")
	public String saveCandidate(Model model, @ModelAttribute Candidate candidate) {
		candidateService.update(candidate);//тут простой апдейт делается
		return "candidateMenu";
	}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Candidate extends Person {//в person id, name 

	private String phone;
	private Date date;
	private User author;
	private String resumeUrl;
	private List<CandidateStatus> statusList = new LinkedList<CandidateStatus>();
	private Set<Vacancy> vacancies = new HashSet<Vacancy>();
	private Set<Skill> skills = new HashSet<Skill>();
	private List<Note> comments = new LinkedList<Note>();
	private Set<Event> events = new HashSet<Event>();

//set get
}
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365267
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
Hibernate: update candidate set name=?, surname=?, author_id=?, creation_date=?, phone=?, cv_url=? where id=?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365269
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinTable(name = "candidate_vacancy", joinColumns = @JoinColumn(name = "candidate_id"), inverseJoinColumns = @JoinColumn(name = "vacancy_id"))
	@XmlTransient
	public Set<Vacancy> getVacancies() {
		return vacancies;
	}
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365278
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее лог такой:
Код: java
1.
2.
3.
Hibernate: update candidate set name=?, surname=?, author_id=?, creation_date=?, phone=?, cv_url=? where id=?
Hibernate: delete from candidate_skill where candidate_id=?
Hibernate: delete from candidate_vacancy where candidate_id=?



без delete всё классно было бы
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365281
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это не смущает -

private Set<Vacancy> vacancies = new HashSet<Vacancy>();
private Set<Skill> skills = new HashSet<Skill>();

?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365287
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

осталось с самого начала, чтобы хоть как-то работало.
убрал new - конкретно на расссатриваему тему это никак не влияет
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365293
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется ты что-то не договариваешь.
Смотри если оставить так -
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);
}

то по идее все будет ок, остальные методы по аналогии.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365306
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

Спасибо - верно.

Я в одном месте пытался увидеть то, что должно быть в другом месте.

хотя, если честно не очень классно, что придется из-за этого теперь везде переписывать добавление в список и добавлять через объемлющий класс.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365309
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
начинаю задумываться.... а ведь у меня eager инициализация. почему при сохранении конструктор вызывается, а инициализация - нет
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365325
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тот же самый принцип, но обнуляем коллекциии в самом методе, если знаем, что они не должны обновляться:
Код: java
1.
2.
3.
4.
5.
6.
	@RequestMapping("/saveCandidate")
	public String saveCandidate(Model model, @ModelAttribute Candidate candidate) {
		candidate.setSkills(null);
		candidateService.update(candidate);//тут простой апдейт делается
		return "candidateMenu";
	}
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365375
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,

а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365387
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90ivanra,

а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ?

так принцип тот же, если хибер в коллекции нулл и маппинг лейзи он просто не будет удалять все, считая что они не подгружены.
Хотя это конечно больше похоже на воркэраунд, чем на решение, но если все в тиме понимают это - то почему нет
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365414
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никredwhite90ivanra,

а не могли бы пояснить причину работоспособности вашего примера исходя из жизненного цикла hibernate ?

так принцип тот же, если хибер в коллекции нулл и маппинг лейзи он просто не будет удалять все, считая что они не подгружены.
Хотя это конечно больше похоже на воркэраунд, чем на решение, но если все в тиме понимают это - то почему нет
авторFetchType.EAGER
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365415
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

авторто каждый раз когда хибер будет создавать экземпляр твоей сущности будет вызываться этот код, и грубо говоря хибер будет считать что это новое значение - поэтому при апдейте он будет удалять все старые.

а когда хибер будет создавать экземпляр моей сущности?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365461
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле, обнуление коллекции - это скорее чит. А вот в методе saveCandidate заложена бомба замедленного действия.
Предлагаю подумать, что будет, если:
- в Candidate добавят новое поле, а на форму забудут
- допустим, доступ к записям из таблицы Candidate разделен по пользователям/ролям. Сможет ли технически подкованный пользователь изменить данные в записи, к которой у него нет доступа?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365520
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный способ объявить коллекцию LAZY и не грузить ее если не требуется. В этом случае можно оставить инициализацию полей пустыми коллекциями - они будут использоваться только для новых обьектов, в загруженные из базы Hibernate подставит свои прокси. Меньше гемороя с проверками на null.
Если нужно модифицировать дочерние коллекции, то загружать обьекты через fetch join или принудительно инициализировать их в DAO.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365778
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пролетевший,

согласен, просто изначально было решено сделать "попроще", и теперь уже много наверное переделывать придётся
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365784
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraНа самом деле, обнуление коллекции - это скорее чит. А вот в методе saveCandidate заложена бомба замедленного действия.
Предлагаю подумать, что будет, если:
- в Candidate добавят новое поле, а на форму забудут
- допустим, доступ к записям из таблицы Candidate разделен по пользователям/ролям. Сможет ли технически подкованный пользователь изменить данные в записи, к которой у него нет доступа?
1 - значение просто нельзя поменять будет. хуже будет если начнут переименовывать

2- если не методом гет, то наверное всё хорошо будет! а так да - спасибо
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365785
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и всё таки может мне кто-нибудь объяснить когда hibernate вызывает конструктор объекта?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365799
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraТот же самый принцип, но обнуляем коллекциии в самом методе, если знаем, что они не должны обновляться:
Код: java
1.
2.
3.
4.
5.
6.
	@RequestMapping("/saveCandidate")
	public String saveCandidate(Model model, @ModelAttribute Candidate candidate) {
		candidate.setSkills(null);
		candidateService.update(candidate);//тут простой апдейт делается
		return "candidateMenu";
	}




Это не работает - всё также обнуляется. все зависимые таблицы обнулились в базе
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365841
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90и всё таки может мне кто-нибудь объяснить когда hibernate вызывает конструктор объекта?
Ну поставь брейкпоинт в конструкторе да посмотри. Короткоий ответ - всегда, когда подгружает из базы. Но если объект есть в кэше - то конструктор вызываться не будет
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38365955
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,

авторвсегда, когда подгружает из базы

Так где у меня подгрузка из базы то?
у меня только загрузка в базу. Но конструктор то вызвался.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366044
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Так где у меня подгрузка из базы то?
у меня только загрузка в базу. Но конструктор то вызвался.
автор Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату
Если только загрузка, то объект новый = создал, приаттачил все списки - сохранил. Всё это в короткой транзакции этой же сессии.
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366091
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)
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366301
Petro123redwhite90Так где у меня подгрузка из базы то?
у меня только загрузка в базу. Но конструктор то вызвался.
автор Мне надо заново грузить из базы вакансии, руками их приаттачивать к кандидату
Если только загрузка, то объект новый = создал, приаттачил все списки - сохранил. Всё это в короткой транзакции этой же сессии.

update. То есть в базе он уже есть
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366316
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 полем действительно беда получается, но иначе придётся действительно в сессию класть объект)
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366869
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90забыл ник,

авторвсегда, когда подгружает из базы

Так где у меня подгрузка из базы то?
у меня только загрузка в базу. Но конструктор то вызвался.

ну где же? где? мне правда очень интересно
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38366876
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
брейкпоинт таки не судьба поставить?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38367099
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл никбрейкпоинт таки не судьба поставить?

Как я могу все случаи проверить когда он вызывается?

написать все возможные вызовы хибернейтом этого объекта?
...
Рейтинг: 0 / 0
Вопрос по хибернейту
    #38367156
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90… Благодаря возможностям спринга я могу получить частично заполненный объект кандидата…
Код в студию, потому как причина в нём и в org.hibernate.event.def.OnUpdateVisitor
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по хибернейту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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