ForeignCollection在使用流进行迭代时抛出SQLException。

问题描述 投票:0回答:1

我有三个实体类。PlayerData, IpDataTwinData.两者 TwinDataIpData 指代 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 列.我是否应该手动创建数据库表,为 TwinDataIpDataplayerData_id 列?还没试过,但我觉得没什么用。

java database orm ormlite
1个回答
0
投票

当我试图遍历 PlayerData.ips 与流,我得到 SQLException[SQLITE_ERROR] SQL错误或数据库缺失(无此列。playerData_id). 自动生成表的方法是 TableUtils.createIfNotExists().

你会得到这个错误,如果 playerData_id 不是表中的一个字段。 我很惊讶 TableUtils.createIfNotExists() 没有建立一个领域 playerData_idIpData 表。 我怀疑这些表已经存在,而且你没有使用ORMLite生成的模式。

默认情况下,当ORMLite看到一个 foreign = true 字段,它将在相关实体中存储该类型的id。 参见 国外领域文件. 如果你的模式是以不同的方式定义实体之间的关系,例如用另一个表来定义关系,那么你将需要自己设置该实体,并使用该实体的DAO来查询。

你也许应该看看 外来对象例子 以获取更多信息。

希望对大家有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.