Java JPA最佳实践:静态查找实体

Java JPA最佳实践:静态查找实体,java,hibernate,orm,jpa,jakarta-ee,Java,Hibernate,Orm,Jpa,Jakarta Ee,想象一下,一个事件实体引用了一个状态实体: @Entity @Table(name = "event") public class Event() { @Id @Column(name = "id", nullable = false) private long id; ... @ManyToOne @JoinColumn(name = "status_code", nullable = false) private Status status; } @Enti

想象一下,一个事件实体引用了一个状态实体:

@Entity
@Table(name = "event")
public class Event()
{
  @Id
  @Column(name = "id", nullable = false)
  private long id;
  ...

  @ManyToOne
  @JoinColumn(name = "status_code", nullable = false)
  private Status status;
}


@Entity
@Table(name = "status")
public class Status()
{
  @Id
  @Column(name = "code", nullable = false)
  private String code;

  @Column(name = "label", nullable = false, updatable = false)
  private String label;
}
状态映射到一个小表“
状态
状态是典型的参考数据/查找实体

   code  label
   ----- --------------
   CRD   Created
   ITD   Initiated
   PSD   Paused
   CCD   Cancelled
   ABD   Aborted
我不确定将状态建模为一个实体是否是一个好主意。它更像是常量的枚举

通过将状态映射为一个实体,我可以在Java代码中使用状态对象,并且状态值在数据库中同样存在。这有利于报道

另一方面,如果我想为一个事件设置一个特定的状态,我不能简单地分配我心目中的恒定状态。我必须首先查找正确的实体:

event.setStatus(entityManager.find(Status.class, "CRD"))
我可以避免上面的代码片段吗?我被罚了一个表现上的点球,看起来很重

  • 我是否必须使用只读属性调整内容
  • 我可以预取这些查找实体并将其用作常量吗
  • 我是否错过了一个关键的JPA功能
欢迎所有意见/建议/建议

谢谢大家!! J

我可以避免上面的代码片段吗?我被罚了一个表现上的点球,看起来很重

那么,您可以使用
enum
。我真的不明白你为什么不这么做


但是,如果您真的想使用实体,那么它将是第二级缓存的完美候选,这将解决您的性能问题。

您可以使用
entityManager.getReference(Status.class,“CRD”)
,如果实体仅用于设置外键,则可能无法从数据库中获取该实体。

很好!这就是我一直在寻找的提示。我可以将状态建模为枚举。这将允许在事件中干净有效地设置状态值。“代码”和“标签”都可以建模为属性。那也很酷。但是,我是否正确理解数据库中没有“标签”信息?这对于外部报告来说有点不幸:我的Java应用程序之外的工具可能想要访问数据库。还是我忽略了什么?枚举也可以映射到它们自己的数据库表吗?我必须仔细查看二级缓存。碰巧,你知道有什么工具可以方便地监视Hibernate中的二级缓存吗?@Jan Right,你不会在数据库中使用带有枚举的标签。但是我实际上会在枚举中使用
创建的
启动的
,等等,而不是代码。不管怎样,使用实体确实可能更好。在这种情况下,@Jörn的建议是个好建议。尽管如此,这个只读实体仍然是二级缓存的完美候选。关于监视,它取决于二级缓存提供程序.Thx。我同意我需要这个二级缓存启动并运行。