#hibernate
#режим гибернации
Вопрос:
Я пытаюсь выяснить, есть ли лучший способ выполнить вставку / обновление в следующем сценарии. У меня есть два класса:
public class Person {
private int id;
private String firstName;
private String lastName;
private Family family;
...
}
public class Family {
private int id;
private String name;
...
}
Первичным ключом в обоих является идентификатор (который я хотел бы сохранить таким образом для целей этого упражнения). Между пользователем и семьей существует связь «многие к одному», поэтому у многих людей может быть одна семья. Мой метод ввода позволяет вам установить любое семейное значение, но я проверяю перед вставкой, существует ли оно:
public void savePerson(Person person) {
System.out.println("Saving person");
Family existingFamily = getFamily(person.getFamily().getName());
if (existingFamily != null) {
person.setFamily(existingFamily);
}
sessionfactory.getCurrentSession().saveOrUpdate(person);
}
...
public Family getFamily(String name) {
System.out.println("Getting family: " name);
Family family
= (Family) sessionfactory.getCurrentSession().createQuery("from Family where name = :name")
.setParameter("name", name)
.uniqueResult();
return family;
}
Мой вопрос в том, можно ли это каким-то образом сделать автоматически через режим гибернации (с которым я немного новичок), или мне всегда нужно заранее проверять базу данных на наличие существующего объекта (и обновлять Person)?
Приветствия
Ходжо
Ответ №1:
Вы можете проверить наличие существующего объекта, используя get()
метод, а не записывая HQL query
Пример:
public boolean getFamily(int famId) {
Family family = (Family)sessionfactory.getCurrentSession().get(Family.class,famId);
if(family!=null){
return true;
}
else{
return false;
}
}
Именно так я делаю в своих проектах. get()
метод возвращает объект, если он присутствует в базе данных, иначе возвращает null.
Комментарии:
1. Привет, спасибо за ответ, я, вероятно, должен был сделать это более понятным, но входные данные просто передают значение «name» для семейства (которое может быть существующим или новым), поэтому у меня не было бы доступа к любому значению Id / primary key (почему я написал запрос HQL). Оглядываясь вокруг, я думаю, что это может быть просто странный уникальный случай с моим примером, когда мне нужно выбрать перед обновлением.