我使用GORM从excel文件中备份数据库中的事件。
new ExcelBuilder(excelFile.inputStream).eachLine([labels: true, sheet: 0]) {
if (cell(0)) {
def nameA = cell(0)
def nameB = cell(1)
def a = Chapitre.findByNom(nameA)
def code = cell(2)
def designation = cell(3)
if (code == null || nameA == null || nameB == null) {
flash.messages << "error"
} else if (!Chapitre.findByNom(nameA)) {
flash.messages << "error"
} else if ( Rubrique.where{nom == nameB && chapitre == a}.list().size() == 0) {
flash.messages << "error"
} else if(Object.where{rubrique == Rubrique.findByNom(nameB) && c == code && d == designation}.count() > 0){
flash.messages << "error"
} else {
def b = Rubrique.findByNom(nameB)
def isNew = false;
Object.withNewSession {session2->
def object = Object.findOrCreateByCode(code)
if(object.designation == null)
isNew = true;
object.rubrique = b
object.d= (designation == null)?"":designation
// try {
rowCount += object.save()? 1 : 0
// } catch(ValidationException) {
// if(isNew)
// rowCount++;
// log.info("ErreuRRRRRRRRrrrRRrrRrRRrrrrRrrrRrrrRrrrr")
// }
}
}
}
currentLine++
}
flash.messages << "${rowCount} ligne create or update"
更新将打破任何后顾之忧,文件行的过程继续,数据库记录有效。
然而,当涉及插入新对象时,我得到一个异常:
org.springframework.dao.DuplicateKeyException: a different object with the same identifier value was already associated with the session:[fen.NuisanceType#2202];
nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
有问题的对象的注册是有效的,但错误是从文件的路径引出的。
当我取消注释try
和catch
时,我绕过了错误,因此我在数据库中创建了每个文件的所有副本。
因此我找到了解决问题的方法,但我发现它并不干净,我来找你试图理解我的问题。
答案 0 :(得分:0)
没有进一步的信息很难给出任何明确的答案。这段代码是否在服务中?(非常怀疑它,因为它有flash.message指向控制器执行所有操作。)尝试将其变为服务和事务,然后您可以查看删除withNewTransaction调用。
您可以阅读有关此处创建的错误的更多信息: Grails - DuplicateKeyException 评论评论: “好吧,当你在会话中已经有另一个已经有了另一个属性的类新的ClassD时会出现这个问题。所以,你应该先尝试获取该实体(这就是findOrCreateWhere所做的,但如果你使用你需要使用的id),然后使用找到的实例或为更新创建一个新的“
你从服务中整理并运行代码:(问题可能会消失),因为我还清理了你正在做的重复发现:
class TestService {
static transactional=true
def saveRecord() {
def results=[]
new ExcelBuilder(excelFile.inputStream).eachLine([labels: true, sheet: 0]) {
if (cell(0)) {
def nameA = cell(0)
def nameB = cell(1)
def code = cell(2)
def designation = cell(3)
def a = Chapitre.findByNom(nameA)
def b = Rubrique.where{nom == nameB && chapitre == a}
def c = Object.where{rubrique == b && c == code && d == designation}
if (!code||!nameA||!nameB||!a||!b||!c) {
results << "Error saving ${nameA} ${nameB} ${code}"
} else {
//boolean isNew = false
def object = Object.findOrSaveWhere(code:code)
if(object) {
if (!object.designation) {
rowCount++
results << "Record ${object} has no designation ? new Record?"
}
object.rubrique = b
object.d = designation ?: ''
object.save()
results << "Record ${object.id} is saved"
} else {
/*
* Could not save or find code:code now create a new object:
* object = new Object(code:code, rubrique:rubrique: d: designation ?: '').save()
*
*/
}
}
}
currentLine++
}
results << "${rowCount} ligne create or update"
return results
}
}