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

时间:2010-08-31 22:16:57

标签: java hibernate orm jpa java-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;
}


@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;
}

状态会映射到一个小表“status”。 状态是典型的参考数据/查找实体。

   code  label
   ----- --------------
   CRD   Created
   ITD   Initiated
   PSD   Paused
   CCD   Cancelled
   ABD   Aborted

我不确定将状态建模为实体是否是一个好主意。感觉更像是常量的枚举......

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

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

event.setStatus(entityManager.find(Status.class, "CRD"))

我可以避免上面的代码片段吗?我担心性能下降,看起来非常沉重......

  • 我是否必须使用只读属性调整内容?
  • 我可以预取这些查找实体并将它们用作常量吗?
  • 我是否错过了一个重要的JPA功能?
  • ...?

欢迎所有意见/建议/推荐!

谢谢! 学家

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

  

我可以避免上面的代码片段吗?我害怕性能下降,看起来很重?

好吧,你可以改用enum。我真的不明白你为什么不这样做。

但是如果你真的想要使用一个实体,那么它将成为二级缓存的完美候选者,这将解决你的性能问题。