Hibernate несколько естественных идентификаторов в сущности - PullRequest
0 голосов
/ 31 августа 2018

У меня есть сущность jpa "пользователь", у которой есть 2 бизнес-ключа: имя пользователя и адрес электронной почты. Эти 2 поля уникальны, и я попытался определить оба поля как naturalId с @NaturalId, однако, когда я выполняю поиск сущности пользователя, передавая только имя пользователя или электронную почту, hibernate выдает исключение с жалобой на отсутствующее значение другого naturalid, поскольку hibernate обрабатывает оба поля как составной естественный идентификатор. Это ограничение гибернации или есть альтернатива для решения этой ошибки?

@Entity
@Table(name = "user",
       indexes = { @Index(columnList = "login"),
                   @Index(columnList = "email")},
       uniqueConstraints = { @UniqueConstraint(columnNames = { "login" }),
                             @UniqueConstraint(columnNames = { "email" })})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@org.hibernate.annotations.NaturalIdCache
public class User {

    @org.hibernate.annotations.NaturalId(mutable = true)
    private String login;

    @org.hibernate.annotations.NaturalId(mutable = true)
    private String email;

    ...
}

Когда я вызываю код ниже:

User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("login", "abc123")
    .load();

или

User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("email", "abc123@xyz.com")
    .load();

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

User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("login", "abc123")
    .using("email", "abc123@xyz.com")
    .load();

1 Ответ

0 голосов
/ 20 октября 2018

Эта концепция не поддерживает более одного бизнес-ключа.

Как вы сказали, аннотирование нескольких свойств с помощью @ NaturalId означает, что этот единственный бизнес-ключ состоит из нескольких свойств (цитата javadoc):

Указывает, что свойство является частью естественного идентификатора юридическое лицо.

Также остальная часть API в некоторой степени сообщает то же самое Например, SimpleNaturalIdLoadAccess создается с помощью bySimpleNaturalId (Class entityClass) и load in SimpleNaturalIdLoadAccess принимает значение естественного идентификатора в качестве аргумента. Нет способа указать естественный идентификатор ведьмы.

...