对象化,手动设置实体 id/name - 用例
Objectify, setting entity id/name manually - use cases
我想在我的应用程序中实现友谊结构。我的第一种方法是创建具有以下结构的 Friendship 实体
@Entity Friendship{
@Id Long id;
@Parent User<Key> userA;
@Index User<Ref> userB;
}
每个友谊都由两个友谊实体表示,每个用户一个。这适用于简单的情况,但现在我想 运行 查询 find user's friends with name foo
,所以我在 Friendship 中添加 @Index String userBName
,并在创建实体时设置它。但是每次 userB 更改他的名字时都需要更新这个值,加上它是索引中的附加列,这是我想避免的事情。
所以我想出了另一种方法:删除 userB
属性 并将 Friendship id
设置为 @Id
将被 userB
引用的用户。然后我将能够查询具有给定名称的用户,根据它的 @Id
创建密钥并按父级和创建的密钥过滤友谊。
@Entity Friendship{
@Id Long id;
@Parent User<Key> userA;
}
Key<User> userA;
Key<User> userB;
Friendship friendshipA;
Friendship friendshipB;
CreateFriendship(){
friendshipA.setId(userB.getId());
friendshipA.setUserA(userA);
friendshipB.setId(userA.getId());
friendshipB.setUserA(userB);
}
现在我的问题是:这是手动设置实体 ID 的正确用例吗?我认为它会起作用,因为 Key 是由父类、类型和 ID 创建的。但另一方面,我不认为这会在实体之间建立逻辑联系。
这是一个好方法,还是我在创建反模式?
如果您的任何 User
实体(即 Friendship
父实体)本身可以有父实体,那么它们的 ID 不 保证是唯一的,因此它们不能用作 Friendship
(或任何其他实体类型)ID。您必须使用整个用户密钥,而不仅仅是 ID,就像在您的 pre-proposal 代码中一样。
否则我觉得还可以。另见
删除 User
实体时请注意始终删除所有其他用户与该用户 ID 的所有友谊。如果相应的用户 ID 将来最终成为 re-used,则遗留的此类孤儿友谊会带来不受欢迎的 "revival" 风险。
我想在我的应用程序中实现友谊结构。我的第一种方法是创建具有以下结构的 Friendship 实体
@Entity Friendship{
@Id Long id;
@Parent User<Key> userA;
@Index User<Ref> userB;
}
每个友谊都由两个友谊实体表示,每个用户一个。这适用于简单的情况,但现在我想 运行 查询 find user's friends with name foo
,所以我在 Friendship 中添加 @Index String userBName
,并在创建实体时设置它。但是每次 userB 更改他的名字时都需要更新这个值,加上它是索引中的附加列,这是我想避免的事情。
所以我想出了另一种方法:删除 userB
属性 并将 Friendship id
设置为 @Id
将被 userB
引用的用户。然后我将能够查询具有给定名称的用户,根据它的 @Id
创建密钥并按父级和创建的密钥过滤友谊。
@Entity Friendship{
@Id Long id;
@Parent User<Key> userA;
}
Key<User> userA;
Key<User> userB;
Friendship friendshipA;
Friendship friendshipB;
CreateFriendship(){
friendshipA.setId(userB.getId());
friendshipA.setUserA(userA);
friendshipB.setId(userA.getId());
friendshipB.setUserA(userB);
}
现在我的问题是:这是手动设置实体 ID 的正确用例吗?我认为它会起作用,因为 Key 是由父类、类型和 ID 创建的。但另一方面,我不认为这会在实体之间建立逻辑联系。
这是一个好方法,还是我在创建反模式?
如果您的任何 User
实体(即 Friendship
父实体)本身可以有父实体,那么它们的 ID 不 保证是唯一的,因此它们不能用作 Friendship
(或任何其他实体类型)ID。您必须使用整个用户密钥,而不仅仅是 ID,就像在您的 pre-proposal 代码中一样。
否则我觉得还可以。另见
删除 User
实体时请注意始终删除所有其他用户与该用户 ID 的所有友谊。如果相应的用户 ID 将来最终成为 re-used,则遗留的此类孤儿友谊会带来不受欢迎的 "revival" 风险。