2012-06-10 5 views
1

Как предотвратить дублирование вставки класса домена?Grails предотвращает дублирование вставок

Locations location = Locations.findByLocationXY(locationxy) 
     if (location == null) 
     { 

      LocationManagement lm = new LocationManagement() 
      location = lm.getSingaporeLocation(locationxy) 
      location.save(flush:true) 
     } 

class Locations { 

int id 
String locationName 
String locationXY 

static constraints = { 
    id(blank:false, unique:true) 
    locationName (blank:false) 
    locationXY (blank:false, unique:true) 
} 
def afterInsert = { 

id= this.id 
locationName = this.locationName 
locationXY = this.locationXY 
} 
+1

в вашей бизнес-модели, что делает местоположение уникальным? localtionXY? название местоположения ? вы должны просто установить уникальное ограничение на это свойство - вам не нужно проверять идентификатор –

+0

Да, применяется ограничение. Могу ли я иметь перед вставкой и проверкой? – user903772

ответ

0

Вам не нужно добавлять ограничения на идентификатор. Это делается граалями автоматически. Я думаю, что если вы удалите это, программа должна выполнить, как вы ожидаете. Единственное уникальное значение - locationXY.

+0

Я спрашиваю, как предотвратить такое же расположениеxy из вставки! – user903772

+0

И вот ответ. Если единственным уникальным ключом является locationXY, тогда grails (database) не позволит вставлять одно и то же locationXY в два раза ... Но вы установили два уникальных ключа (кстати, неверный путь) один из идентификаторов. Который автогенерируется для каждой записи. То же самое, что не иметь уникального ключа – matcauthon

+0

Хорошо, чтобы сделать его немного яснее. Удалите строку 'id (blank: false, unique: true)' и проверьте исключение, которое вызывается, если вы хотите вставить одинаково «locationXY». – matcauthon

4

Вы должны позволить Grails справиться с этим - нет необходимости в дополнительном коде, если вы правильно определяете свои противопоказания.

И, как я понимаю, у вас уже есть

locationXY (blank:false, unique:true) 

Так что с того, что я читал из кода, это не должно быть возможно вставить другое место с тем же locationXY.

Вы проверили содержимое своей базы данных после запуска кода? Вы действительно получаете две строки в таблице с тем же locationXY?

кстати: ваша линия

location.save(flush:true) 

не сгенерирует исключение, так как вы не указали failOnError:true. Таким образом, следующая строка может привести к тому, что вы ожидаете:

location.save(flush:true, failOnError:true) 

PS: что ваш afterInsert код? Я хотел бы удалить его для ясности.

Смежные вопросы