【问题标题】:ManyToOne ClassCastExceptionManyToOne ClassCastException
【发布时间】:2017-01-10 17:44:30
【问题描述】:

我正在尝试创建一个“简单”的 OneToMany 和 ManyToOne 关系。 我得到以下异常:

引起:java.lang.ClassCastException: org.hibernate.mapping.ManyToOne 不能转换为 org.hibernate.mapping.Component 在 org.hibernate.mapping.PersistentClass.getRecursiveProperty(PersistentClass.java:464) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.mapping.PersistentClass.getRecursiveProperty(PersistentClass.java:420) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:758) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:719) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1655) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1623) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) ~[hibernate-core-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) ~[hibernate-entitymanager-5.0.9.Final.jar:5.0.9.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874) ~[hibernate-entitymanager-5.0.9.Final.jar:5.0.9.Final] 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) ~[spring-orm-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] ... 39个常用框架 省略

有人能告诉我我做错了什么吗?

您可以在下面找到我的两个实体。

在此先感谢您。

  import javax.persistence.OneToMany;
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"questionGroupID","questionID"})})
public class QuestionGroupEntity implements Serializable{

    private static final long serialVersionUID = 1796640204447018439L;

    @Id
    @NotEmpty
    @Column(name="question_group_id")
    private String questionGroupID;

    @NotEmpty
    private String label;


    @NotEmpty
    private String questionID;


    @OneToMany(fetch=FetchType.EAGER,targetEntity=QuestionGroupMappingEntity.class,mappedBy="questionGroup")
    List<QuestionGroupMappingEntity> questionGroupMappings;

import javax.persistence.ManyToOne;
    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"questionGroupID","questionID","answerID"})})
    public class QuestionGroupMappingEntity implements Serializable {

        private static final long serialVersionUID = 8437546139229082305L;

        @Id
        @SequenceGenerator(name="groupMappingIDGenerator")
        @GeneratedValue(generator="groupMappingIDGenerator",strategy=GenerationType.AUTO)
        private String groupMappingID;

        @NotEmpty
        private String questionID;

        @NotEmpty
        private String questionGroupID;

        @NotEmpty
        private String answerID;

        @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="question_group_id")
        private QuestionGroupEntity questionGroup;

【问题讨论】:

  • 你定义了getter和setter吗?您在哪个电话上收到错误消息?

标签: spring hibernate jpa spring-boot


【解决方案1】:

感谢您的回答。 我通过添加这些属性解决了这个问题 spring.jpa.hibernate.ddl-auto=更新 spring.jpa.generate-ddl=true 问题是 spring-data 无法更新架构。

【讨论】:

    【解决方案2】:

    请检查您的QuestionGroupEntity 实体,配置private String questionGroupID; 的列名称为“question_group_id”,但您仍然添加一个带有“questionGroupID”列的@UniqueConstraint(columnNames={"questionGroupID","questionID"})},这将导致异常

    原因:org.hibernate.AnnotationException:无法在表 question_group_entity 上创建唯一键约束(questionGroupID、questionID):找不到数据库列“questionGroupID”。确保使用正确的列名称,这取决于使用的命名策略(它可能与实体中的属性名称不同,尤其是关系类型) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.buildUniqueKeyFromColumnNames(InFlightMetadataCollectorImpl.java:2090) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.buildUniqueKeyFromColumnNames(InFlightMetadataCollectorImpl.java:1965) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processUniqueConstraintHolders(InFlightMetadataCollectorImpl.java:1953) 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1629) 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)

    修复此问题后,使用 spring boot 1.4 即可

    【讨论】:

    • 事件如果我删除所有唯一约束我仍然得到这个错误
    • 顺便说一句,这不是我得到的例外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2021-12-05
    • 2012-02-08
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多