Room Library中为Transaction与Person表建立关联的问题咨询
问题1:该关联是否属于一对一关系
关联的类型由你的实际业务规则决定,和字段本身没有强制绑定关系:
- 若你的业务要求1个Person仅能关联唯一1笔Transaction,同时1笔Transaction仅对应唯一1个Person,那该关联就是一对一关系。不过你当前的字段设计存在冗余:不需要两个类都存对方的关联字段,仅需在其中一方保存另一方的主键作为外键即可,比如只在Person类中保留
TransactionId关联Transaction类的主键id,或者只在Transaction类中保留traderID关联Person类的主键id,避免后续更新数据时出现两边关联字段不一致的问题。 - 若你的业务允许1个Person对应多笔Transaction,那该关联就是一对多关系,仅需在Transaction类中保留
traderID关联Person的主键id即可。
如果要实现Room层面的关联查询,你可以额外创建一个组合POJO类来封装关联数据,示例如下:
// 一对一查询Person+对应Transaction的示例POJO public class PersonWithTransaction { @Embedded public Person person; @Relation( parentColumn = "TransactionId", entityColumn = "id" ) public Transaction transaction; }
问题2:是否需要为每个类分别创建对应的Dao
建议为每个Entity单独创建对应的Dao,这是Room开发的最佳实践:
- 每个Dao仅负责对应单表的增删改查操作,符合单一职责原则,代码逻辑更清晰,后续维护、排查问题也更方便。
- 如果你需要做跨表的关联查询,只需要在任意一个关联表的Dao中添加对应的查询方法即可,不需要额外创建专门的关联Dao,示例如下:
// 在PersonDao中添加关联查询方法 @Transaction @Query("SELECT * FROM Person WHERE id = :personId") PersonWithTransaction getPersonWithTransaction(long personId);
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

