JPA: частичное противоречие - PullRequest
0 голосов
/ 05 июля 2011

Мне нужно что-то вроде частичного противопоказания для одной из моих сущностей.

@Entity
public class MyEntity 
{
  @NotNull
  private String name;

  @ManyToOne @NotNull
  private Type type;
}

Только для sinlge type Мне нужно name, чтобы быть уникальным.

Возможно ли это с @UniqueConstraint или мне нужно реализовать это с @PrePersist и @PreUpdate слушателем?До сих пор я не реализовал такого слушателя, но даже если я проверю ограничения в этом слушателе, это гарантирует предотвращение дублирующейся записи?

Обновление

Предположим, что ограничение должно быть активным только для type=special

  • Разрешено {id=1,type=normal,name=Test},{id=2,type=normal,name=Test}
  • Недопустимо: {id=3,type=special,name=Test},{id=4,type=special,name=Test}

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Мое понимание @UniqueContraint состоит в том, что он может содержать список имен столбцов, которые вместе определяют уникальность.

См .: проверка уникальных ограничений в JPA

   @UniqueConstraint(columnNames={"name", "type"}) 

Я ожидаю, что это обеспечит уникальность имени и типа.(Нет времени для тестирования.)

Редактировать:

Ага.Так что теперь я понимаю проблему.Как насчет этого для подхода ввести третий атрибут:

 int mySpecialValue;

Этот атрибут не имеет открытого сеттера.Вместо этого его значение устанавливается setType () с логикой, подобной этой:

 public void setType(String theType){

      type = theType;          

      if ( "special".equals(type) ){
              mySpecialValue = 0;
      } else {
              mySpecialValue = makeUniqueInt(); // eg. some date twiddling
      }

 }

Теперь установите уникальное ограничение, включающее mySpecialValue.Следовательно, для всех специальных предложений уникальность полностью зависит от имени, для других всегда есть дифференциатор, поэтому имена могут дублироваться.

       Allowed {id=1,type=normal,name=Test, msv = 343223 },
                {id=2,type=normal,name=Test, msv = 777654 } <== not dup
       Not allowed: {id=3,type=special,name=Test, msv =0 },
                        {id=4,type=special,name=Test, msv =0} <== dup  
1 голос
/ 05 июля 2011

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

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