я создал два простой Grails классов домена V3, где местоположение внедренных типа атрибута в родительском Venue как этогоне может получить каскадные сохранить не стирают на встроенном класс иого работать
import java.time.LocalDate
class Venue {
String name
LocalDate dateCreated
LocalDate lastVisited
LocalDate lastUpdated
GeoAddress location
static hasOne = [location:GeoAddress]
static embedded =['location']
static constraints = {
lastVisited nullable:true
location nullable:true
}
static mapping = {
location cascade: "all-delete-orphan", lazy:false //eager fetch strategy
}
}
class GeoAddress {
String addressLine1
String addressLine2
String addressLine3
String town
String county
String country = "UK"
String postcode
static belongsTo = Venue
static constraints = {
addressLine1 nullable:true
addressLine2 nullable:true
addressLine3 nullable:true
town nullable:true
county nullable:true
country nullable:true
postcode nullable:true
}
}
однако, когда я пишу тест интеграции - я обнаружил, что создание каскада для местоположения не работает (мне нужно сохранить местоположение, которое оно больше не трансформируется, прежде чем перейти в место встречи. Также, когда я запускаю удаление на месте с помощью flush: true enabled и запрос для адреса i получить возвращенный внедренный адрес - я думал с флешем: true, я бы увидел, что мой каскад GeoAddress удаляется, но мой тест завершился неудачно, поскольку я не получаю null при использовании GeoAddress.get (loc.id), поскольку я ожидал
@Integration
@Rollback
class VenueIntegrationSpec extends Specification {
void "test venue with an address"() {
when: "create a venue and an address using transitive save on embedded "
GeoAddress address = new GeoAddress (addressLine1: "myhouse", town: "Ipswich", county: "suffolk", postcode : "IP4 2TH")
address.save() //have to save first - else Venue save fails
Venue v = new Venue (name: "bistro", location: address)
def result = v.save()
then: "retrieve venue and check its location loaded eagerly "
Venue lookupVenue = Venue.get(v.id)
GeoAddress loc = lookupVenue.location
loc.postcode == "IP4 2TH"
loc.town == "Ipswich"
when: " we delete the venue, it deletes the embedded location (Address)"
v.delete (flush:true)
GeoAddress lookupLoc = GeoAddress.get (loc.id)
then: "address should disppear"
lookupLoc == null
}
Я думал, что настроил это правильно, но ясно, что у меня его нет. может ли кто-нибудь выяснить, почему мои каскадные действия для Venue.save() и delete() не каскадируются в запись моего встроенного местоположения (GeoAddress).
заранее спасибо
Я пробовал вот так - и удалил место до удаления места проведения, затем тест затем проходит. Если я удаляю loc delete, он терпит неудачу. когда: «мы удаляем место встречи, оно удаляет встроенное местоположение (адрес)» loc.delete (flush: true) v.delete (flush: true) if (v.hasErrors()) println "errors: $ v.errors» GeoAddress lookupLoc = GeoAddress.get (loc.id) затем: "адрес должен disppear" Venue.get (v.id) == NULL lookupLoc == NULL –
и если вы изменили' hasOne' в 'GeoAddress location' как определенный объект в классе домена, затем сделал его« location (nullable: true) », он удаляется тогда? – Vahid
как раз на работе в mo - придется сделать небольшую реструктуризацию, чтобы попробовать это - обновит вас, когда я получу первый момент, чтобы сделать это –