Как я могу выразить это ограничение с JPA? - PullRequest
2 голосов
/ 22 августа 2011

У меня есть класс, который выглядит так:

public enum Scope {
  A, B, C...
}

@Entity
public class User {

    ...

    Scope scope; // enum, see above

    @ElementCollecton
    List<Long> numbers;

    ...
}

Моя проблема в том, что я не знаю, как выразить следующее ограничение либо с помощью JPA, либо непосредственно в моей базе данных Postgres: Тамможет быть только один пользователь с областью действия x, у которого есть число y.

Чтобы пояснить, что я имею в виду, псевдокод:

Это верно (Bobs 3 не сталкиваетсяс Томом 3, так как Боб имеет другую область видимости): Том (область = A, числа = [1,2,3,4]), Карл (область = A, число = [5,6,7]), Боб (область= B, числа = [3, 42, 100])

Но это недопустимо (Карлс 4 нарушает ограничение, так как Том имеет ту же область и также 4 в своем списке): Том (область = A,числа = [1,2,3,4]), Карл (область = A, число = [4,5,6,7]), Боб (область = B, числа = [3, 42, 100])

Спасибо за вашу помощь, Фабиан

1 Ответ

1 голос
/ 22 августа 2011

Одна вещь, которую вы можете сделать, это солгать JPA о внешнем ключе для коллекции элементов, а затем наложить обычное уникальное ограничение на комбинацию scope + number в таблице коллекции.

@Column(name="SCOPE")
@Enumerated(EnumType.STRING)//or whatever
private Scope scope;

@ElementCollection
@CollectionTable(name= "NUMBERS" ,
    joinColumns={ @JoinColumn(name = "USER_ID", referencedColumnName = "ID"),
                  @JoinColumn(name = "USER_SCOPE", referencedColumnName = "SCOPE") }),
@Column(name="NUMBER")
private List<Long> numbers;

Очевидно, USER_SCOPEв нормализованной модели совершенно не требуется, но, сказав JPA, что это часть ключа, вы можете обмануть провайдера, чтобы он поддерживал колонку для вас.

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