Kotlin暴露-没有标识列的表的实体

时间:2019-08-23 22:44:03

标签: sql postgresql kotlin primary-key kotlin-exposed

我在Kotlin公开库中可以找到的所有材料都假设该表具有主标识列,因此在大多数示例中,这些实体都继承了IntEntity抽象类。例如:

class UserLocation(id: EntityID<Int>) : IntEntity(id) {
    companion object : IntEntityClass<UserLocation>(UserLocations)

    var userId by UserLocations.userId
    var user by User referencedOn UserLocations.user
    var recordedAt by UserLocations.recordedAt
    var insertedAt by UserLocations.insertedAt
    var point by UserLocations.point

与该表定义相对应:

object UserLocations : IntIdTable("user_locations") {

    val userId = integer("user_id")
    val user = reference("user_id", Users)
    val recordedAt = datetime("recorded_at").nullable()
    val insertedAt = datetime("inserted_at")
    val point = point("point")
}

问题是,我的表实际上没有标识列。我知道一个表没有主键的所有负面影响,但是不幸的是,我只能对该表进行读访问。我无法对该表进行写访问以添加主键。

在公开库的Wiki的某一点上,它提到对象表定义可以继承Table而不是IntIdTable,但是这要求实体继承不同的东西,而我不能完全找到了实体应该继承的内容,而不是IntEntity

我的问题:当表没有id列时,我的实体应该继承什么(而不是IntEntity)。

2 个答案:

答案 0 :(得分:4)

暴露的DAO需要某些身份才能从表中获取和存储实体。它不需要是主列或自动增量列,但在这种情况下,您必须确保该列中的值是唯一的。

例如,您可以将实体映射到具有字符串ID的表:


auto iter = std::stable_partition(object1->vector_.begin(), object1->vector_.end(), [](Class* x)  
{
    if (x->object2_ != nullptr)
    {

        return !x->object2->parameter_;
    }

});

答案 1 :(得分:1)

Kotlin公开的API包含两个部分。它带有DAO API和DSL API。有关更多详细信息,请参见readme。如果您没有某种类型的ID表/主键,则需要使用DSL API。 DSL API更接近原始SQL,但仍会阻止诸如SQL注入之类的事情,并且是类型安全的。

简而言之,您想要做的/不能做,请改用DSL API。