Я создал два простых доменных класса Grails V3, в которых местоположение является встроенным типом атрибута в родительском месте, как это
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 и запрашиваю адрес, я все еще получаю возвращенный встроенный адрес - я думал, что с flush: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)?