在JPA中持久化类:使用@id创建一个抽象超类,使用@EmbeddedId或更多:优点和缺点

时间:2015-01-24 09:48:31

标签: java jpa inheritance relational-database uniqueidentifier

最近,我一直在考虑一种模拟关系数据库主键概念的方法。在这种模型中,每个关系(表)都有自己的关系。所有表,但是"连接表",都有自己的字段。根据我的经验,大多数时候它是一个"自动增量"整数字段,当它不必具有特定的语义时,它完全有意义。应用程序级别"。

在面向对象模型中,我们有几种方法来管理分配ID的问题,以便可以保留实体对象。 JPA允许使用@Id Annotation,但它也允许使用@EmbeddedId,这样就可以创建一个ID类并将其嵌入到任何要保留的对象中。

根据我的经验,我发现使用抽象超类IdentifiableEntity非常快,它具有@Id Long id。 任何其他类,而不是扩展Object,都会扩展此类或IdentifiableEntity子层次结构中的另一个类。 使用继承策略TABLE_PER_CLASS(并且通常利用Spring Data),这变成了在所有类之间共享的单个ID计数器,因此任何持久化的对象都会在整个系统中获得唯一的ID。 这可能适用于小型项目,例如当这样的IdentifiableEntity与其他类有自己的一组关系时。

另一种方法是将@Id字段放入IdentifiableEntity的任何子树中,即我可以复制与id相关的代码(包括将类映射到表的继承策略)。我不喜欢这样:我正在复制代码,在配置问题时我真的不喜欢它。但是,当具有唯一父级(即IdentifiableEntity)没有意义时,这就是我采用的解决方案。这也适用于大型项目。 一个更合适的解决方案可能是让一个@MappedSuperclass具有这样的id字段,然后将所有其他子树植根在这样的类中。这样,关系模型中没有共享ID,但仍然没有复制代码。

您通常使用哪种解决方案?您认为可能的解决方案存在哪些优点和缺点?

0 个答案:

没有答案