1.19.2015

5. Ключ сущности, составной ключ. Hibernate



Как я упоминал ранее,  каждая сущность нуждается в уникальном ключе, который будет идентифицировать её.  Ключи могут быть простыми, состоящими из одного поля  сущности или составными. Большинство статей в интернете приводят примеры только с простым ключом, как будто бы не существует такой надобности как составные ключи, состоящие из нескольких полей,  давайте рассмотрим,  как все реализуется в hibernate, начнем с простых ключей.  Любой ключ должен быть объявлен  у сущности аннотацией @Id, хотя могут существовать сущности  и без ключа, но  в документации по hibernate  очень не рекомендуют так поступать.  Типы данных, которые могут выступать в роли ключа,  их не много, это  простые типы byte, char, int, short, long их классы обертки Byte, Character , Integer, Short, Long,   тип String,  два временных типа  - java.util.Date,  java.sql.Date и тип java.math.BigInteger  а так же любые сериализуемые объекты, реализующие интерфейс  Serializable.  Автоматическую генерацию значения ключа можно применить только к простому ключу,  сложный ключ приходится  “генерировать” вручную.  Давайте рассмотрим пример с работой сложного ключа, опишем класс ключа, он должен соответствовать всем требованиям, которые применимы при описании сущности, т.е. реализовать интерфейс Serializable, переопределять методы toString(), Equals(), HashCode(), подробный список требований смотрите в главе  2  “Наш первый проект”. И так опишем класс Key:  

public class Key implements Serializable {
    private Long id1;
    private Long id2;

    public Key(Long id1, Long id2) {
        this.id1 = id1;
        this.id2 = id2;
    }

    public Key() {
    }
  
    Геттеры и Сеттеры
}

Описываем в сущности Person ключ  класса Key, при помощи аннотации @Id:

@Entity
@Table(name = "Persons")
public class Person implements Serializable {
    static final long serialVersionUID = -7593775012501239455L;

    @Id
    private Key id1;
}

В программе создаем  объект Key и устанавливаем вручную поле id1  и  работаем  так же как с простым  ключом, ни чего сложного и нового:

         session.getTransaction().begin();
            Person person = new Person();
            person.setFirstName("Vitaly");
            person.setSecondName("Lopanov");
            Key key = new Key(1L,1L);
            person.setId1(key);
            session.save(person);
            System.out.printf("Insert Person: %s\n", person);
            Key id = person.getId1();
            session.getTransaction().commit();
            session.close();

Комментариев нет:

Отправить комментарий