Android房间关系

时间:2018-04-11 08:20:51

标签: android spring-data-jpa android-room

我有两个看起来像这样的实体(为了阅读而简化)。

@Entity
public class Machine {
    @PrimaryKey
    private long id
}

@Entity
public class MachineType {
    @PrimaryKey
    private long id
}

我想要的是机器实体拥有机器类型。 我尝试过外键,但我的问题在于它根本不像Spring Boot等效的Persistence库那样包含外来实体(我不知道如何解释得这么好)。下面是Spring中REST-api的一个例子:

{
    "id": 1,
    "name": "foo",
    "machineType": {
        "id": 1,
        "name": "bar"
    }
}

虽然有外键的房间是这样的:

{
    "id": 1,
    "name": "foo",
    "machineType_id": 1
}

这会在将对象放回API时给我带来各种麻烦。 所以我尝试使用@Relation注释,因为这听起来像我需要的,但是只创建了一个错误,因为相关对象的列包含在主实体中,所以我得到两个" id"列。

  

错误:多个字段具有相同的columnName:id。字段名称:id,machineType>标识。

请帮忙。我在错误的轨道上吗?对我的问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

嵌入式注释在这种情况下非常有用。 Link for embedded

所以你需要做的是在Machine类中有一个MachineType对象,并用@Embedded注释它。另外,为了避免两个具有相同名称的变量,在这种情况下它是id,您可以使用此注释 @ColumnInfo(name = "some_column_name")的列名与变量名不同。

Link for Column Info

答案 1 :(得分:1)

当您插入数据更改表列名称时,如下面的代码,您可以在房间数据库中给出列名。

@Entity
public class Machine {
    @PrimaryKey
    @ColumnInfo(name = "nId")
    private long id;
    @ColumnInfo(name = "machineType_id")
    private long mId;

}

@Entity
public class MachineType {
    @PrimaryKey
    @ColumnInfo(name = "machineType_id")
    private long id;
}

当您获得相同类的api响应时,服务器密钥的特定字段的时间唯一密钥使用此关键字如下所示...

@SerializedName("name")
@ColumnInfo(name="sName")
private String name;
相关问题