gpt4 book ai didi

java - 具有 objectify 功能的安全嵌入式实体

转载 作者:行者123 更新时间:2023-11-30 03:29:05 26 4
gpt4 key购买 nike

我有两个实体。

@Entity
public class Recipe {
@Id
private Long id;
private List<Step> steps;
}
@Entity
public class Step {
@Id
private Long id;
private String instruction;
}

以及以下云端点

@ApiMethod(
name = "insert",
path = "recipe",
httpMethod = ApiMethod.HttpMethod.POST)
public Recipe insert(Recipe recipe) {
ofy().save().entities(recipe.getSteps()).now(); //superfluous?
ofy().save().entity(recipe).now();

logger.info("Created Recipe with ID: " + recipe.getId());

return ofy().load().entity(recipe).now();
}

我想知道如何跳过必须首先保存嵌入实体的步骤。两个实体的 Id 均未设置。我希望 objectify 自动创建这些。但如果不保存嵌入实体,我会得到一个异常。

com.googlecode.objectify.SaveException: Error saving com.devmoon.meadule.backend.entities.Recipe@59e4ff19: You cannot create a Key for an object with a null @Id. Object was com.devmoon.meadule.backend.entities.Step@589a3afb

由于我的对象结构将变得更加复杂,因此我需要找到一种方法来跳过此手动步骤。

最佳答案

我假设您正在尝试创建真正的嵌入对象,而不是存储在数据存储中并链接的单独对象。您额外的 save() 实际上是保存单独的实体。你不希望这样。

您有两个选择:

  1. 不要为嵌入对象提供 ID。不要给它@Entity,也不给它id字段(或者至少消除@Id)。这只是一个POJO。 90% 的情况下,这就是人们想要的嵌入式对象。
  2. 使用分配器自行分配 ID,通常是在(非默认)构造函数中。

假设您想要一个具有真正 key 的真正嵌入式实体,#2 可能是您应该使用的。请记住,这个 key 有点异想天开,因为您实际上无法加载它;只能在数据存储中查找容器对象。

我建议更进一步,永远不要对任何实体使用自动 ID 生成。始终在实体的(非默认)构造函数中使用分配器。这确保实体始终拥有有效、稳定的 ID。如果您始终在事务开始之前分配 ID,它会修复重试事务时可能创建的重复实体。填充 null id 是一个坏主意,确实不应该添加到 GAE 中。

关于java - 具有 objectify 功能的安全嵌入式实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29475637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com