Я смущен относительно того, как реализовать это, или если это действительно возможно. Мой коллега и я строим веб-приложение для клиента с использованием Grails 3. Он создал начальные домены, которые я угадываю, где копия «один-к-одному» из моделей Realm из мобильных приложений. С тех пор я модифицировал их, пытаясь получить некоторую форму глубокого клонирования, поскольку три домена имеют отношения «один ко многим».Глубокая копия доменов «один-ко-многим» в Grails 3
Проблема
Как бы я идти о создании глубокой копии домена? Я попытался предложенные ответы с небольшим успехом:
собирание идей из разных мест, я пришел к разработке метода clone(Domain)
показано ниже. Это почти работает (я думаю), но имеет проблемы с коллекциями, бросающими HibernateException - Found shared references to a collection: Location.equipments
.
Вызывается в контроллере, как:
def copy() {
Survey.clone(Survey.get(params.id))
redirect action: 'index'
}
Любые идеи или рекомендации?
В настоящее время домены являются следующие:
class Survey {
int id
String name
String contactName
String contactEmail
String facilityAddress
String facilityCity
String facilityStateProvince
String facilityZip
String distributorName
String distributorEmail
String distributorPhoneNumber
static Survey clone(Survey self) {
Survey clone = new Survey()
String exclude = "locations"
clone.properties = self.properties.findAll {
it.key != exclude
}
self.locations.each {
Location copy = Location.clone it
clone.addToLocations copy
}
clone.save()
}
static transients = ['clone']
static belongsTo = User
static hasMany = [locations: Location]
}
class Location {
int id
String name
String[] hazardsPresent
HazardType[] hazardTypes
ExposureArea[] exposureArea
RiskLevel exposureLevel
String comments
byte[] picture
static Location clone(Location self) {
Location clone = new Location()
String[] excludes = ['equipment', 'products']
clone.properties = self.properties.findAll {
!(it.key in excludes)
}
self.equipments.each {
Equipment copy = Equipment.clone it
self.addToEquipments copy
}
self.products.each {
RecommendedProduct copy = new RecommendedProduct()
copy.properties = it.properties
copy.save()
clone.addToProducts copy
}
clone.save()
}
static transients = ['clone']
static belongsTo = Survey
static hasMany = [equipments: Equipment, products: RecommendedProduct]
static constraints = {
picture(maxSize: 1024 * 1024)
}
}
class Equipment {
int id
EquipmentType type
String name
Brand brand
// Redacted 26 boolean properties
// ...
static Equipment clone(Equipment self) {
Equipment clone = new Equipment()
String exclude = "extras"
clone.properties = self.properties.findAll {
it.key != exclude
}
self.extras.each {
EquipmentQuestionExtra copy = new EquipmentQuestionExtra()
copy.properties = it.properties
copy.save()
clone.addToExtras copy
}
clone.save()
}
static transients = ['clone']
static belongsTo = Location
static hasMany = [extras: EquipmentQuestionExtra]
}
class RecommendedProduct {
int productId
int quantityChosen
String comment
static belongsTo = Location
}
class EquipmentQuestionExtra {
int id
String questionText
String comment
byte[] picture
static belongsTo = Equipment
static constraints = {
picture(maxSize: 1024 * 1024)
}
}
клонирование, что вы делаете должно быть клонирование каждого объекта независимо от его типа. Следовательно, клонировать коллекции также. –