Java 与Room的多对多关系导致错误:实体和POJO必须具有可用的公共构造函数

Java 与Room的多对多关系导致错误:实体和POJO必须具有可用的公共构造函数,java,android,kotlin,android-room,Java,Android,Kotlin,Android Room,我遇到了标题中提到的问题。我拥有以下实体: @Entity(tableName = "Person") data class Person(@PrimaryKey var id: Int, var firstName: String, var surname: String, var age: Int, var numberOfHobbies: Int) { @Ignore

我遇到了标题中提到的问题。我拥有以下实体:

@Entity(tableName = "Person")
data class Person(@PrimaryKey var id: Int,
              var firstName: String,
              var surname: String,
              var age: Int,
              var numberOfHobbies: Int) {
    @Ignore
    constructor() : this(0, "", "", 0, 0)
}

@Entity(tableName = "Skill")
data class Skill(@PrimaryKey var id: Int,
             var skillName: String) {
    @Ignore
    constructor() : this(0, "")
}

@Entity(tableName = "PersonSkill")
data class PersonSkill(var personId: Int,
                   var skillId: Int) {
    @Ignore
    constructor() : this(0, 0)

    @field:PrimaryKey(autoGenerate = true)
    var id: Int = 0
}
以及以下关系:

data class SkillWithPersons(
    @Embedded var skill: Skill = Skill(0, "UNKNOWN"),
    @Relation(
            parentColumn = "id",
            entityColumn = "skillId",
            entity = PersonSkill::class,
            projection = arrayOf("personId")
    ) var personIds: List<Int> = emptyList()
) {
      constructor() : this(Skill(0, "UNKNOWN"), emptyList())
 }

data class PersonWithSkills(
    @Embedded var person: Person = Person(0, "UNKNOWN", "UNKNOWN", 0, 0),
    @Relation(
            parentColumn = "id",
            entityColumn = "personId",
            entity = PersonSkill::class,
            projection = arrayOf("skillId")
    ) var skillIds: List<Int> = emptyList()
) {
      constructor(): this(Person(0, "UNKNOWN", "UNKNOWN", 0, 0), emptyList())
}
我正在使用以下版本:

Android Studio 3.0和Gradle 4, 房间:
1.0.0-alpha9-1
, 构建工具:
26.0.2
, 科特林:
1.1.51


使用
@Relation
似乎有一个bug,因为kotin kapt似乎无法处理它。以前有人遇到过这种情况吗?我甚至试图从
@关系中删除
投影
,但即使这样也没有什么区别。

@房间里的关系标签现在只支持Florina Muntenescu在她的博客中提到的一对多关系

此外,对于上述问题,请按照以下所述更改数据类

@Entity(tableName = "Person")
data class Person(@PrimaryKey 
                  var id: Int = 0,
                  var firstName: String = "",
                  var surname: String = "",
                  var age: Int = 0,
                  var numberOfHobbies: Int = 0)

@Entity(tableName = "Skill")
data class Skill(@PrimaryKey 
                 var id: Int = 0,
                 var skillName: String = "")

@Entity(tableName = "PersonSkill")
data class PersonSkill(@PrimaryKey 
                       var id: Int = 0
                       var personId: Int = 0,
                       var skillId: Int = 0)



data class SkillWithPersons(
    @Embedded 
    var skill: Skill? = null 
    @Relation(
            parentColumn = "id",
            entityColumn = "skillId",
            entity = PersonSkill::class,
            projection = arrayOf("personId")) 
            var personIds: List<Int> = ArrayList()
            )

data class PersonWithSkills(
    @Embedded 
    var person: Person? = null
    @Relation(
            parentColumn = "id",
            entityColumn = "personId",
            entity = PersonSkill::class,
            projection = arrayOf("skillId")) 
            var skillIds: List<Int> = ArrayList()
)
@实体(tableName=“Person”)
数据类人员(@PrimaryKey
变量id:Int=0,
var firstName:String=“”,
变量姓氏:String=“”,
变量年龄:Int=0,
变量numberOfHabiots:Int=0)
@实体(tableName=“Skill”)
数据类技能(@PrimaryKey)
变量id:Int=0,
var skillName:String=“”)
@实体(tableName=“PersonSkill”)
数据类PersonSkill(@PrimaryKey
变量id:Int=0
变量personId:Int=0,
var skillId:Int=0)
数据类人员技能(
@嵌入
变量技能:技能?=null
@关系(
parentColumn=“id”,
entityColumn=“skillId”,
entity=PersonSkill::class,
投影=阵列(“人形”))
var personIds:List=ArrayList()
)
数据类人员技能(
@嵌入
变量person:person?=null
@关系(
parentColumn=“id”,
entityColumn=“personId”,
entity=PersonSkill::class,
投影=阵列(“skillId”))
var skillIds:List=ArrayList()
)

这样您就可以消除错误

您是否在Java和annotation processor中尝试了相同的文件室模式而不是kapt?从默认构造函数中删除
@Ignore
,为我消除了该错误。@Virusman这对我不起作用
@Entity(tableName = "Person")
data class Person(@PrimaryKey 
                  var id: Int = 0,
                  var firstName: String = "",
                  var surname: String = "",
                  var age: Int = 0,
                  var numberOfHobbies: Int = 0)

@Entity(tableName = "Skill")
data class Skill(@PrimaryKey 
                 var id: Int = 0,
                 var skillName: String = "")

@Entity(tableName = "PersonSkill")
data class PersonSkill(@PrimaryKey 
                       var id: Int = 0
                       var personId: Int = 0,
                       var skillId: Int = 0)



data class SkillWithPersons(
    @Embedded 
    var skill: Skill? = null 
    @Relation(
            parentColumn = "id",
            entityColumn = "skillId",
            entity = PersonSkill::class,
            projection = arrayOf("personId")) 
            var personIds: List<Int> = ArrayList()
            )

data class PersonWithSkills(
    @Embedded 
    var person: Person? = null
    @Relation(
            parentColumn = "id",
            entityColumn = "personId",
            entity = PersonSkill::class,
            projection = arrayOf("skillId")) 
            var skillIds: List<Int> = ArrayList()
)