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