【问题标题】:org.hibernate.AnnotationException: No identifier specified for entityorg.hibernate.AnnotationException:没有为实体指定标识符
【发布时间】:2014-04-06 06:43:08
【问题描述】:

我有一个 groovy 实体 ClientInvoiceAttachmentExt,它扩展了 java 实体 ClientInvoiceAttachment。 ClientInvoiceAttachment 有 @Id 注释,但仍然看到“没有为实体指定标识符”错误

这是我的堆栈跟踪

[Mar 03 17:11:54] ERROR | org.springframework.web.context.ContextLoader | Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'collaborationAPI': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.dc.apps.collaborationportal.security.service.CollaborationSecurityService com.dc.apps.collaborationportal.core.api.CollaborationAPI.security; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'collaborationSecurityService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.dc.apps.collaborationportal.feature.service.FeatureService com.dc.apps.collaborationportal.security.service.CollaborationSecurityService.featureService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'featureService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.dc.core.api.Services com.dc.apps.collaborationportal.feature.service.FeatureService.api; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'services': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.dc.core.api.SearchAPI com.dc.core.api.Services.search; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchAPI': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private transient org.hibernate.SessionFactory com.dc.core.entity.service.impl.QueryService.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is com.dc.core.common.exception.BaseApplicationException: org.hibernate.AnnotationException: No identifier specified for entity: com.dc.apps.collaborationportal.ebilling.model.impl.ClientInvoiceAttachmentExt

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.dc.apps.collaborationportal.ebilling.model.impl.ClientInvoiceAttachmentExt
    at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:268)
    at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:223)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:686)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:720)
    at com.dc.core.entity.support.CustomFieldsSessionFactoryBean.buildSessionFactory(CustomFieldsSessionFactoryBean.java:252)
    ... 94 more

我的 pom 依赖项

    <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-search</artifactId>
            <!-- this is the latest version that works with lucene-core 3.0.3
                 (which we are stuck with until jackrabbit supports later versions) -->
            <version>3.3.0.Final</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>xml-apis</groupId>
                    <artifactId>xml-apis</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>ejb3-persistence</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-commons-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

这是我的 Java 类

package com.dc.apps.collaborationportal.ebilling.model.impl;

import javax.persistence.AssociationOverride;
import javax.persistence.Embedded;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;

import org.hibernate.annotations.Entity;

import com.dc.core.common.annotations.AttributeMetadataDefaults;
import com.dc.core.common.annotations.EventDefaults;
import com.dc.core.common.annotations.EventHandlerDefaults;
import com.dc.core.entity.model.IPersistentEntityInstance;
import com.dc.core.entity.model.impl.File;
import com.dc.core.events.enums.EventTypeEnum;
import com.dc.core.security.annotation.AttributeReadPermission;
import com.dc.core.security.annotation.AttributeWritePermission;
import com.dc.core.security.annotation.ContainerReference;

@Entity
@EventDefaults({
        @EventHandlerDefaults(eventType = EventTypeEnum.OnBeforeCreate, beanName = "checksumInvoiceAttachmentCommand"),
        @EventHandlerDefaults(eventType = EventTypeEnum.OnBeforeCreate, beanName = "encryptInvoiceAttachmentCommand") })
public class ClientInvoiceAttachment implements IPersistentEntityInstance {

    private static final long   serialVersionUID = 1L;
    private Long                id;

    private File                attachment;

    private String              checksum;

    private String              invoiceNumber;

    @Embedded
    @AssociationOverride(name = "fileData", joinColumns = @JoinColumn(name = "attachment_file_data_id"))
    public File getAttachment() {
        return attachment;
    }

    public String getChecksum() {
        return checksum;
    }

    @Transient
    @AttributeMetadataDefaults(defaultDisplay = true)
    public String getFileName() {
        if (attachment == null) return "";
        return attachment.getName();
    }

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public String getInvoiceNumber() {
        return invoiceNumber;
    }

    public void setAttachment(File attachment) {
        this.attachment = attachment;
    }

    public void setChecksum(String checksum) {
        this.checksum = checksum;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setInvoiceNumber(String invoiceNumber) {
        this.invoiceNumber = invoiceNumber;
    }

}

这是我的 groovy 课程

package com.dc.apps.collaborationportal.ebilling.model.impl

import com.dc.core.api.Services;

import java.util.List
import javax.persistence.Column
import javax.persistence.OneToMany
import javax.persistence.ManyToMany
import javax.persistence.ManyToOne
import javax.persistence.Cacheable
import javax.persistence.Transient
import javax.persistence.JoinColumn
import javax.persistence.Embedded
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.OneToOne
import javax.persistence.AssociationOverride
import javax.persistence.Lob
import javax.persistence.FetchType
import javax.persistence.Entity
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Indexed
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Store;
import org.hibernate.annotations.NamedQueries
import org.hibernate.annotations.NamedQuery
import org.hibernate.envers.Audited
import org.hibernate.envers.NotAudited
import org.hibernate.annotations.Cascade
import org.hibernate.annotations.Type
//import org.hibernate.annotations.Index
import org.hibernate.annotations.LazyCollection
import org.hibernate.annotations.LazyCollectionOption
import org.hibernate.annotations.Formula
import org.hibernate.annotations.Fetch
import org.hibernate.annotations.FetchMode
import org.hibernate.annotations.BatchSize
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
import org.springframework.beans.BeansException
import com.dc.core.entity.enums.VersionStatusEnum
import com.dc.core.behavior.command.model.ICommandResult
import com.dc.core.behavior.command.model.impl.CommandResult
import com.dc.core.behavior.command.model.IEntityInstanceCommand
import com.dc.core.entity.model.IPersistentEntityInstance
import com.dc.core.behavior.trackchanges.model.IEntityChangeset
import com.dc.core.security.model.IContainer
import com.dc.core.security.annotation.ContainerReference
import com.dc.core.security.annotation.Encrypted
import com.dc.core.collaboration.enums.CollaborationRequestStatus
import com.dc.core.collaboration.model.ICollaborationParcel
import com.dc.core.collaboration.model.ICollaborationFeatureDetail
import org.hibernate.annotations.Cache
import org.hibernate.annotations.CacheConcurrencyStrategy


@javax.persistence.Entity
class ClientInvoiceAttachmentExt extends com.dc.apps.collaborationportal.ebilling.model.impl.ClientInvoiceAttachment implements IAmGroovy, Serializable {

    @Autowired
    protected transient Services         services;

 private static final long                    serialVersionUID = 711967972L;
  public java.lang.String getCreatedBy() {
    return this.createdBy;
  }

  public void setCreatedBy(java.lang.String createdBy) {
    this.createdBy = createdBy;
  }

  protected createdBy;

  public java.lang.String getUpdatedBy() {
    return this.updatedBy;
  }

  public void setUpdatedBy(java.lang.String updatedBy) {
    this.updatedBy = updatedBy;
  }

  protected updatedBy;

  public java.sql.Timestamp getCreatedAt() {
    return this.createdAt;
  }

  public void setCreatedAt(java.sql.Timestamp createdAt) {
    this.createdAt = createdAt;
  }

  protected createdAt;

  public java.sql.Timestamp getUpdatedAt() {
    return this.updatedAt;
  }

  public void setUpdatedAt(java.sql.Timestamp updatedAt) {
    this.updatedAt = updatedAt;
  }

  protected updatedAt;

  protected transient ApplicationContext applicationContext; 

}

【问题讨论】:

    标签: java hibernate groovy orm


    【解决方案1】:

    我在使用 JPA 时遇到了同样的错误,我添加了 @Id 注释,

    在使用 JPA 时,请确保此 @Id 注释应该来自包 javax.persistence.Id 而不是来自 org.springframework.data.annotation.Id.

    希望它能节省您宝贵的时间。

    【讨论】:

      【解决方案2】:

      有一个新注释@MappedSuperclass 添加到基类中,它只影响 OOP 而无需更改数据库。这就是我一直在寻找的。你可以阅读更多关于它in this post

      【讨论】:

      • 赞成,这对我来说非常适合。非常感谢
      【解决方案3】:

      我看到了类似的错误。如果您有一个与其他类具有一对一关系的类,则该其他类应该有一个主键作为标识符。 (我的应用使用的是 spring boot,jpa,h2,lombok)

      例如:

      @Entity
      @Getter
      @Setter
      Class A{
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
      
       @OneToOne(cascade = CascadeType.ALL)
          @JoinColumn(name="b")
          public B b;
      }
      

      现在,如果您错过了为 B 类编写主键或标识符,可能会引发类似的错误,如下所示

      @Entity
      @Getter
      @Setter
      Class b{
      
         /* Same error may be raised when he below code is missing*/
         @Id
         @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long b_id;
      
           @OneToOne(mappedBy = "bid")
          public A a;
      
      }
      

      【讨论】:

        【解决方案4】:

        您的问题场景是继承映射。 Id 字段在您的超类中,但是您的子类呢,它们将如何与其父类相关。

        映射继承层次结构有不同的策略。

        1. 使用鉴别器值(单表)
        2. 每个具体类的表
        3. 每个子类的表(如果父类是抽象类)

        我认为您缺少与上述相关的注释。

        在基于判别器的方法中。您需要如下注释您的 ParentClass:

        @Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
        @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)  
        @DiscriminatorValue(value="ParentClass")  
        

        在你的孩子班里:

        @DiscriminatorValue("childClasss")
        

        请参考一些关于继承映射的教程,如this one,或者你可以谷歌它。

        【讨论】:

        • 鉴别器列默认为“DTYPE”,鉴别器类型为 DiscriminatorType.STRING,鉴别器值默认为实体名称,因为鉴别器列,鉴别器值注释未指定。所以添加这些注释并不能解决我的问题。
        • @RanPaul 你还遇到同样的问题No identifier specified for entity: com.dc.apps.collaborationportal.ebilling.model.impl.ClientInvoiceAttachmentExt 吗? @Inheritance 注释呢,我希望你也将它添加到你的父类中。你也可以发布你的配置文件吗?
        • 是的,我添加了@Inheritance(strategy = InheritanceType.SINGLE_TABLE),但我仍然看到 org.hibernate.AnnotationException
        • 我建议您阅读上面的教程,因为我高度怀疑您仍然存在继承映射问题。 discriminator column defaults to "DTYPE" 不正确,您需要在父类和子类中添加一些值。
        • 您必须将@MappedSuperclass 添加到您的超类实体中
        猜你喜欢
        • 2015-07-25
        • 2016-01-31
        • 2020-05-02
        • 2013-02-25
        • 2021-05-19
        • 2011-05-21
        • 2014-11-09
        • 1970-01-01
        相关资源
        最近更新 更多