ForeignCollection在使用流进行迭代时引发SQLException

时间:2019-06-12 09:30:33

标签: java database orm ormlite

我有三个实体类:PlayerDataIpDataTwinDataTwinDataIpData都用外键引用PlayerData

代码如下:

@DatabaseTable
public class PlayerData {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField
    private UUID uuid;

    @ForeignCollectionField
    private ForeignCollection<IpData> ips;

    @ForeignCollectionField
    private ForeignCollection<TwinData> twins;

    // Getters and setters...
}

@DatabaseTable
public class IpData {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(foreign = true)
    private PlayerData playerData;

    @DatabaseField
    private Date firstUsage;

    @DatabaseField
    private String address;

    // Getters and setters...
}

@DatabaseTable
public class TwinData {
    @DatabaseField(generatedId = true)
    private int id;

    @DatabaseField(foreign = true)
    private PlayerData mainPlayer;

    @DatabaseField
    private boolean adminNoticed;

    @DatabaseField
    private UUID uuid;

    // Getters and setters...
}

当我尝试使用流迭代PlayerData.ips时,我得到SQLException [SQLITE_ERROR] SQL error or missing database (no such column: playerData_id)。表格是通过TableUtils.createIfNotExists()自动生成的。

这是引发该异常的代码:

// playerData is retrieved from Dao<PlayerData, Integer>
playerData.getIps().stream().noneMatch(ip -> ip.getAddress().equals(playerIp))

我真的不明白为什么它尝试选择playerData_id列。 是否应该使用TwinData列为IpDataplayerData_id手动创建数据库表?还没有尝试过,但是我认为这没有帮助。

1 个答案:

答案 0 :(得分:0)

当我尝试使用流迭代PlayerData.ips时,出现SQLException [SQLITE_ERROR] SQL错误或缺少数据库(没有这样的列:playerData_id)。表格是使用TableUtils.createIfNotExists()自动生成的。

如果playerData_id不是表中的字段,则会出现该错误。令TableUtils.createIfNotExists()不在playerData_id表中创建字段IpData感到惊讶。我怀疑这些表已经存在,并且您没有使用ORMLite生成的架构。

默认情况下,当ORMLite看到一个foreign = true字段时,它将在相关实体中存储该类型的ID。请参见foreign fields documentation。如果您的架构以不同的方式定义实体之间的关系,例如使用另一个表来定义关系,那么您将需要自己设置该实体,并使用该实体的DAO查询该实体。

您也许应该查看foreign object example以获得更多信息。

希望这会有所帮助。