Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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 在Hibernate实体中映射泛型属性时发生异常_Java_Hibernate_Jpa - Fatal编程技术网

Java 在Hibernate实体中映射泛型属性时发生异常

Java 在Hibernate实体中映射泛型属性时发生异常,java,hibernate,jpa,Java,Hibernate,Jpa,我们正在从HibernateXML迁移到annotation,在映射泛型属性后启动EAR时出现了此异常 Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.AppTerminalTypeCriteria.devicePropertiesCri

我们正在从HibernateXML迁移到annotation,在映射泛型属性后启动EAR时出现了此异常

Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.AppTerminalTypeCriteria.devicePropertiesCriteria
这是与此异常相关的代码

AppTerminalTypeCriteria类中的映射属性

@javax.persistence.Entity
@Table(name = "TYPE_CRITERIA")
public class AppTerminalTypeCriteria {
//Some fields
    @OneToMany(orphanRemoval = true)
    @JoinTable(inverseJoinColumns=@JoinColumn(name="APP_CRITERIA_PROPERTY_ID"))
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    private Set<PropertyCriteria<?>> devicePropertiesCriteria = new HashSet<PropertyCriteria<?>>();

}
@javax.persistence.Entity
@表(name=“TYPE\u标准”)
公共类AppTerminalTypeCriteria{
//一些领域
@OneToMany(孤立删除=真)
@JoinTable(inverseJoinColumns=@JoinColumn(name=“APP\u-CRITERIA\u-PROPERTY\u-ID”))
@org.hibernate.annotations.Cache(用法=cacheconcurrentystrategy.TRANSACTIONAL)
私有集>();
}
财产标准实体

@Entity(name="PropertyCriteria")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "PROPERTY_CRITERIA")
@DiscriminatorColumn(name = "PROPERTY_CRITERIA_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class PropertyCriteria<T extends Comparable<T>> implements Serializable {
// the rest of the class 
}
@实体(name=“PropertyCriteria”)
@继承(策略=InheritanceType.SINGLE_表)
@表(name=“属性\标准”)
@DiscriminatorColumn(name=“PROPERTY\u CRITERIA\u TYPE”,discriminatorType=discriminatorType.STRING)
公共抽象类PropertyCriteria实现了可序列化{
//班上其他人
}
以及不动产标准的一个子类

@Entity
@DiscriminatorValue("5")
public class BooleanPropertyCriteria extends PropertyCriteria<Boolean> {

}
@实体
@鉴别器值(“5”)
公共类BooleanPropertyCriteria扩展了PropertyCriteria{
}
这就是我们试图摆脱的XML映射

在AppTerminalTypeCriteria.hbm.xml中

<set name="devicePropertiesCriteria" inverse="false" cascade="all-delete-orphan">
            <cache usage="transactional" />
            <key column="APP_CRITERIA_PROPERTY_ID" />
            <one-to-many
                class="PropertyCriteria"
                entity-name="PropertyCriteria" />
</set>
<class name="PropertyCriteria" table="PROPERTY_CRITERIA" entity-name="PropertyCriteria">
<discriminator type="string" column="PROPERTY_CRITERIA_TYPE" />
<subclass name="com.emeint.server.core.propertycriteria.BooleanPropertyCriteria" discriminator-value="5" />

在PropertyCriteria.hbm.xml中

<set name="devicePropertiesCriteria" inverse="false" cascade="all-delete-orphan">
            <cache usage="transactional" />
            <key column="APP_CRITERIA_PROPERTY_ID" />
            <one-to-many
                class="PropertyCriteria"
                entity-name="PropertyCriteria" />
</set>
<class name="PropertyCriteria" table="PROPERTY_CRITERIA" entity-name="PropertyCriteria">
<discriminator type="string" column="PROPERTY_CRITERIA_TYPE" />
<subclass name="com.emeint.server.core.propertycriteria.BooleanPropertyCriteria" discriminator-value="5" />


如何修复此异常?

错误消息明确表示实体未在持久性单元中注册。可能您没有在persistence.xml中将这个PropertyCriteria.hbm.xml列为映射文件?

,您的XML映射对泛型一无所知?@Smutje是的,看来soHibernate在泛型方面似乎有问题,而且泛型也不是一个数据库概念,因此我建议将它们排除在您的实体之外——如果您想使用它们,最好在表示域模型的实体之上有第二层域对象使用普通Java机制(如泛型)。混合责任很少是一个好主意,至少我尝试让实体尽可能靠近数据库结构。请在
appternaltypecriteria
class@NikolaiShevchenko我在这个类中添加了注释,这就是你的意思吗?我们正在从XML迁移到注释,因此,我们删除了mapping PropertyCriteria.hbm.xml。您是否在persistence.xml中将该类列为
?我们不必这样做。其他实体在没有定义它们的情况下工作得很好。我不知道你的应用程序是如何构造的,也许这个类不是你部署的一部分,或者不是扫描的包之一?尝试调试到异常发生的点,并确定Hibernate是否识别该实体。如果没有,你必须找出它为什么没有被拾起。