首页 > 解决方案 > 使用 Grails、GORM 和 neo4j 的关系类进行自引用多对多

问题描述

我有一个具有自引用多对多的 Grails 域类:

class ModelElement {

    String name
    String elementType
    String modelType
    String description
    String toolIdentifier
    
    
    static hasMany = [
        relatedFrom: ModelElement,
        relatedTo: ModelElement
    ]
    
    static mappedBy = [
        relatedFrom: 'relatedTo',
        relatedTo: 'relatedFrom'
    ]
    
    
    static mapping = {
        id generator: 'assigned',
        name: 'toolIdentifier'
    }
    
    static constraints = {
        description nullable:true
    }
}

我想使用如下关系类映射neo4j中的关系:

    import grails.neo4j.Relationship

class ModelRelationship implements Relationship<ModelElement, ModelElement> {

    String name
    String relationshipType
    String modelType
    String description
    String toolIdentifier

    static constraints = {
        name nullable:true
        description nullable:true
    }
}

当我尝试这段代码时:

            def element1 = new ModelElement(
                name: 'Test Name 1',
                modelType: "Archimate",
                elementType: "Assessment",
                toolIdentifier: 'A123').save()
            def element2 = new ModelElement(
                name: 'Test Name 2',
                modelType: "Archimate",
                elementType: "Assessment",
                toolIdentifier: 'Z456').save()
            def relationship = new ModelRelationship(
                modelType: "Archimate",
                relationshipType: "Association",
                toolIdentifier: 'Z456',
                from: element1,
                to: element2).save()

我得到如下所示的异常。我还尝试将relatedFrom 和relatedTo 属性更改为ModelRelationship 类型,但是这会为mappedBy 创建一个映射错误,因为ModelRelationship 上不存在这些属性。

有任何想法吗?

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'me.yellek.adtf.model.ModelRelationship' with class 'org.grails.datastore.mapping.keyvalue.mapping.config.KeyValuePersistentEntity' to class 'org.grails.datastore.gorm.neo4j.RelationshipPersistentEntity'
    at grails.neo4j.Relationship$Trait$Helper.type(Relationship.groovy:44)
    at grails.neo4j.Relationship$Trait$Helper.getType(Relationship.groovy:53)
    at grails.neo4j.Relationship$Trait$Helper.hashCode(Relationship.groovy:84)
    at java.base/java.util.HashMap.hash(HashMap.java:340)
    at java.base/java.util.HashMap.put(HashMap.java:612)
    at java.base/java.util.HashSet.add(HashSet.java:221)
    at grails.gorm.validation.PersistentEntityValidator.validate(PersistentEntityValidator.groovy:68)
    at org.grails.datastore.gorm.GormValidationApi.doValidate(GormValidationApi.groovy:124)
    at org.grails.datastore.gorm.GormValidationApi.validate(GormValidationApi.groovy:153)
    at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:71)
    at org.grails.datastore.gorm.GormInstanceApi.doSave(GormInstanceApi.groovy:333)
    at org.grails.datastore.gorm.GormInstanceApi.save_closure5(GormInstanceApi.groovy:180)
    at groovy.lang.Closure.call(Closure.java:412)
    at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:319)
    at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:40)
    at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:179)
    at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:119)
    at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:100)
    at me.yellek.adtf.model.ModelRelationshipSpec.test basic relationship mapping(ModelRelationshipSpec.groovy:30)

标签: grailsgroovyneo4jgrails-orm

解决方案


推荐阅读