【问题标题】:Non null relationships in primary constructor of entity实体的主构造函数中的非空关系
【发布时间】:2019-02-13 12:50:14
【问题描述】:

我正在使用 Spring Data Neo4j 和 Kotlin 创建应用程序。我使用标准的 kotlin 方式来声明实体(具有主构造函数的类)。一切正常,直到我想在我的实体之间创建简单、一对多和强制的关系。当我在我的存储库上调用.findAll() 时,我得到Parameter specified as non-null is null: method ...model.Campaign.<init>, parameter client

我尝试调用 .findAll(depth = 1) 将相关实体加载到我的实体,但没有帮助。

@NodeEntity
class User(var name: String)
{
    @Id @GeneratedValue
    var id: Long? = null
}

@NodeEntity
class Campaign(
    var name: String,
    @Relationship(type = "CLIENT", direction = Relationship.OUTGOING)
    var client: User)
{
    @Id @GeneratedValue
    var id: Long? = null
}

interface CampaignRepository : Neo4jRepository<Campaign, Long>

//...

campaignRepository.save(Campaign("C1", user))

campaignRespository.findAll()

当然,我可以将var client: User? 声明为可空,一切都很好。但是,由于在我的模型中,我将有强制和可选的关系,我想知道是否有办法克服这个问题。

【问题讨论】:

  • 您确定您实际获取的所有广告系列都有客户吗?
  • 在我的测试用例中,我在插入之前调用campaignRepository.deleteAll()
  • 所以,其他活动不可能尝试映射到非空字段
  • 既然clientvar,也许你可以用lateinit 来修复它?
  • 在 kotlin 中,您不能在主构造函数参数上使用 lateinit

标签: kotlin neo4j neo4j-ogm


【解决方案1】:

我找到了解决方案,但不是很优雅:

@NodeEntity
class Campaign(
    var name: String,
    client: User?)
{
    @Id @GeneratedValue
    var id: Long? = null

    @Relationship(type = "CLIENT", direction = Relationship.OUTGOING)
    lateinit var client: User

    init
    {
        client?.let { this.client = it }
    }
}

【讨论】:

  • 有一个针对此问题的半官方解决方法here。相当多的额外代码,但确实可以完成这项工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多