Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPA中持久化类:使用@EmbeddedId或更多创建带有@id的抽象超类:优缺点_Java_Jpa_Inheritance_Relational Database_Uniqueidentifier - Fatal编程技术网

Java 在JPA中持久化类:使用@EmbeddedId或更多创建带有@id的抽象超类:优缺点

Java 在JPA中持久化类:使用@EmbeddedId或更多创建带有@id的抽象超类:优缺点,java,jpa,inheritance,relational-database,uniqueidentifier,Java,Jpa,Inheritance,Relational Database,Uniqueidentifier,最近,我一直在考虑建立关系数据库主键概念模型的方法。在这种模型中,每个关系(表)都有自己的关系。除“联接表”外,所有表都有自己的字段。根据我的经验,大多数情况下,它是一个“自动递增”的整数字段,当它不必在“应用程序级别”具有特定的语义时,这是完全有意义的 在面向对象模型中,我们有几种方法来管理分配ID的问题,以便可以持久化实体对象。JPA允许@Id注释,但也允许使用@EmbeddedId,这样就可以创建一个Id类并将其嵌入任何要持久化的对象中 根据我的经验,我很快就发现使用了一个抽象的超类Ide

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

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

根据我的经验,我很快就发现使用了一个抽象的超类IdentifiableEntity,它有一个@Id长Id。 任何其他类(而不是扩展对象)都会扩展该类或位于IdentifiableEntity子层次结构中的另一个类。 使用继承策略表_PER_CLASS(通常利用Spring数据),这将变成所有类之间共享的单个ID计数器,因此任何要持久化的对象都会在整个系统中获得唯一的ID。 这可能适用于小型项目,例如,当此类可识别实体与其他类有自己的关系集时

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


您通常使用什么解决方案?您认为可能的解决方案有哪些优点和缺点?

继承策略不是用于此的工具。您应该使用
@MappedSuperclass
。没有理由让ID在所有实体中都是唯一的。用户和订单行没有理由有一个共同的父实体。看起来你没有。永远不要使用
@heritation
来执行此操作。使用
@MappedSuperclass
。继承是作为一种解决方案存在的,它在OO模型中是有意义的。一般来说,可识别实体可能有自己的一组关系,因此它的存在是有意义的。我所看到的限制在于到关系模型的映射:编写更多(配置)复制代码并获得正确的关系模型。我写的代码更少,可能会得到不正确的关系模型。这是一个观点问题。
@MappedSuperclass
是关于使用继承的。你至少读过javadoc吗?与
@heritation
的区别在于,它是关于代码和映射继承的,而不是关于实体继承的。用户和订单行没有任何共同之处,只是它们都共享一个映射到名为ID的列的长ID。这是代码继承,这就是MappedSuperclass允许的。为什么要这样做?您是否曾经编写过返回同一集合中的用户和订单行的查询?不,因为他们完全没有共同之处。您可以编写一个查询,返回同一集合中的Workers和Managers,这就是继承很有用的地方。我再次重申:MappedSuperclass是关于使用继承的。您可以而且应该在用MappedSuperclass注释的基类中定义ID列和映射。这正是它的目的。