当前位置: 首页 > 知识库问答 >
问题:

如何解决“实体和POJO必须具有可用的公共构造函数”

秦俊友
2023-03-14

这个问题我在SO上见过好几次了。然而这个解决方案似乎不适用于我的问题。

我有一个Kotlin数据类,它被用作房间中的一个实体

@Entity(tableName = "training_session")
data class SessionEntity(
    @PrimaryKey(autoGenerate = false) val id: Long,
    @ColumnInfo(name = "current_state_marker") val currentState: Short,
    @Embedded val states: List<Int>
)

它正在产生

> Task :training-infrastructure:kaptDebugKotlin FAILED
error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List
error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.List

在同一个项目中,我有一个非常相似的实体,它也有一个列表,不会产生任何错误。

尝试了MikeT提供的答案,对我来说,它需要对转换器的定义方式进行一个小的改变

data class SessionStateList (val stateList : List<Int>) 

class SessionStateListConverter {

    @TypeConverter
    fun fromArraySessionStateList(sh: List<Int>?): String? {
        return Gson().toJson(sh)
    }
    @TypeConverter
    fun toArraySessionStateList(sh: String?): List<Int>? {
        val listType: Type = object : TypeToken<ArrayList<Int?>?>() {}.type
        return Gson().fromJson(sh,listType)
    }
}

快速跟进。我曾经提到过,我有另一个实体,它有一个嵌入的val-something:List

原因是,我没有注意到任何编译器错误是因为实体不包括在@Database注释中。


共有1个答案

戴树
2023-03-14

不能将列表/数组等作为列类型。因此,您的问题集中在@Embedded val states:List上

你可以有一个POJO例如。股东:-

data class StatesHolder(
    val stateList: List<Int>
)

然后有

@Entity(tableName = "training_session")
data class SessionEntity(
    @PrimaryKey(autoGenerate = false) val id: Long,
    @ColumnInfo(name = "current_state_marker") val currentState: Short,
    val states: StatesHolder
)
  • 请注意,您不能嵌入StatesHolder,因为那只是插入List。如果你想嵌入,那么你必须嵌入一个使用StatesHolder的包装。

然后需要TypeConverter将StatesHolder对象转换为可存储的类型。可能是一个字符串,也可能是StatesHold对象的JSON响应,例如。

class Converters {

    @TypeConverter
    fun fromStatesHolder(sh: StatesHolder): String {
        return Gson().toJson(sh)
    }
    @TypeConverter
    fun toStatesHolder(sh: String): StatesHolder {
        return Gson().fromJson(sh,StatesHolder::class.java)
    }
}

您还需要使用@TypeConverters注释来定义Converts::class。如果在@数据库级别编码,则转换器具有完整作用域。

因此,在@数据库(......)之后,您可以:-

@TypeConverters(Converters::class)

 类似资料:
  • 问题内容: 我的第一个问题是- 构造函数应始终声明为公共吗? 如果我创建一个构造函数该怎么办。 我总是看到构造函数是隐式的。那么为什么构造函数有用呢?还是根本没有用。因为没有人可以调用它,或者永远也不能创建对象(由于构造函数)!这是我的第二个问题。 问题答案: 不, 构造函数 可以是,, 或(根本没有访问修饰符)。 做某事 并不意味着没有人可以访问它。这只是意味着该类之外的任何人都不能访问它。因此

  • 问题内容: 我有一个带有私有构造函数的类’ClassA’。 现在,我正在扩展类’ClassA’[ 在执行此操作之前删除了 final 关键字] 现在,我得到了。这是什么意思,如何解决? 注意 我不能更改ClassA构造函数的访问说明符。 问题答案: 将ClassA的构造方法可见性从更改为。 构造函数总是从调用超类构造函数开始。如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。否则,将隐含

  • 本文向大家介绍hibernate 实体类必须要有无参构造函数吗?为什么?相关面试题,主要包含被问及hibernate 实体类必须要有无参构造函数吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 hibernate 中每个实体类必须提供一个无参构造函数,因为 hibernate 框架要使用 reflection api,通过调用 ClassnewInstance() 来创建实体类的实例,如果没

  • 问题内容: 我在Sonar上收到此警告,我希望解决方案在声纳上消除此警告。我的课是这样的: 我想要适当的解决方案以消除此声纳警告。 问题答案: 如果此类仅是实用程序类,则应将该类定型并定义一个私有构造函数: 这样可以防止默认的无参数构造函数在代码的其他地方使用。另外,您可以将类定型,这样就不能在子类中对其进行扩展,这是实用程序类的最佳实践。由于您仅声明了一个私有构造函数,因此其他类将无法对其进行扩

  • 我正在使用Spring并在“mapper”字段的第一个控制器中遇到问题: 上下文初始化期间遇到异常-取消刷新尝试:org。springframework。豆。工厂UnsatisfiedPendencyException:创建名为“controller”的bean时出错:未满足的依赖项通过字段“mapper”表示;嵌套的异常是org。springframework。豆。工厂BeanCreationE

  • 我对字段访问JPA注释的POJO非常困惑。 当字段是私有的时,您应该如何设置(或获取)它们?我更喜欢使用字段注释(我没有使用getter/setter方法),但我对它的工作方式有点困惑。