Выбор режима гибернации перед обновлением

#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). Оглядываясь вокруг, я думаю, что это может быть просто странный уникальный случай с моим примером, когда мне нужно выбрать перед обновлением.