Мое понимание @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