【发布时间】:2015-08-09 11:44:50
【问题描述】:
我有两个同名的实体,但在不同的包中。对我来说,很明显这应该有效。实体没有重复的名称。
但我收到一个错误:
Caused by: org.hibernate.AnnotationException: Use of the same entity name twice: Variant
我找到了解决方案,它告诉我使用字符串值作为 @Entity 注释的名称属性的参数,例如:
@Entity(name="legal_Variant")
但我不喜欢在代码中使用字符串。可以通过其他方式完成吗? F.e.使用 java 反射,或以某种方式配置 JPA 以使用全名(带有包名)?
对我来说这很奇怪。我认为JPA 也会处理包名。
我的课程代码:
package insurance.models.liability.hiv;
@Entity
@Table(name="lLiability_Part_Hiv_Var")
public class Variant extends GenericDictionary<Variant> {
}
package insurance.models.liability.legal;
@Entity
@Table(name="liability_Part_Legal_Var")
public class Variant extends GenericDictionary<Variant> {}
【问题讨论】:
-
你可以指定类名和包来避免这个错误,而不是使用别名。 @Entity(name="insurance.models.liability.hiv.Variant") @Entity(name="insurance.models.liability.legal.Variant")
-
JPA 规范明确指出默认实体名称是“不合格”实体类名称。此名称用于 JPQL 查询,因此使用完全限定的类名可能有点麻烦。 Java 注释不允许使用反射或类似的东西,因为该值必须在编译时解析。 Java 代码中的字符串不是总是 邪恶的;例如您通常会使用字符串来指定任何 JPQL 查询。您可以使用语义名称(例如“HIV_Variant”和“Legal_Variant”)。这些将是可读的,并且可以合理地不受类名更改的影响。
-
-
根据 Brian Vosburgh 的回答,我会使用字符串名称。但在进一步的编码中,我将尝试将这些实体合并为一个,以避免重复。也许我会使用
inheritance将特定元素拆分为不同的Entities