【问题标题】:I can't create my repository because I don't have @Id我无法创建我的存储库,因为我没有 @Id
【发布时间】:2020-03-11 09:57:29
【问题描述】:

我需要对一个表进行“CRUD”,但是数据库中的表没有主键,所以我将@Entity 更改为@Embeddable。我的@repository 现在有这个问题。

@Embeddable
@Table(name = "TB_MAIN")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TB_Main {

@Column(name = "EXPOSURE")
private String exposureType;

@Column(name = "TIPOLOGY")
private String tipology;
}

@Repository
public interface TbMainRepository extends CrudRepository<TB_Main,String>{

}

@Service
public class ManualLoadImpl implements ManualLoadService {
    //Repository
    @Autowired
    private TbMainRepository tbMainRepo;

错误代码是:

11-03-2020 10:48:05.928 [main] ERROR o.s.boot.SpringApplication.reportFailure - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'manualLoadImpl': Unsatisfied dependency expressed through field 'tbMainRepo'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tbMainRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class posicion.app.model.manualload.TB_Main
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:598)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
    at posicion.app.Application.main(Application.java:10)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tbMainRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class posicion.app.model.manualload.TB_Main
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1771)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1255)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595)
    ... 19 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not a managed type: class posicion.app.model.manualload.TB_Main
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:552)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:74)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:201)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:151)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:134)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:65)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:305)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:211)
    at org.springframework.data.util.Lazy.get(Lazy.java:94)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1830)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767)
    ... 29 common frames omitted

我该如何解决这个问题?

【问题讨论】:

  • @Embeddable 旨在将信息嵌入到其拥有的实体中,但并不意味着充当实体本身。
  • 没有身份证?在这种情况下,您几乎不知道如何更新数据库中的特定行(有点违背 CRUD 的目的)。是否有可能这两个字段一起是该表的复合 id?

标签: java spring-boot spring-data-jpa


【解决方案1】:

没有主键的实体是不可能的,并且可嵌入对象只能存在于实体内部。

您必须使用表中形成唯一键的列在实体中创建主键。

【讨论】:

    【解决方案2】:

    您使用@Entity 将其作为表格表示是正确的。您需要在一个字段上使用@Id 来指示这是您的表中的主键。每张桌子都应该有一个。 @Embeddable 用于另一个目的。例如,见下文。

    @Id
    @Column(name = "EXPOSURE")
    private String exposureType;
    

    【讨论】:

      【解决方案3】:
      1. 最佳解决方案是将主键添加到表中。
      2. 您可以在类中的所有字段中添加@Id 注释。但是请谨慎使用此变通方法,因为它只能在您要读取数据时应用,如果数据库中有相同的条目,则插入 hibernate 会生成update SQL 语句。

      【讨论】:

        【解决方案4】:

        @Embeddable 注释用于声明该类将被另一个实体嵌入。 检查 @EmbeddedId : 我参考了休眠文档Hiberate 3.5 annotations参考

        【讨论】:

          【解决方案5】:

          不仅仅是 Spring-data-JPA——关系数据模型需要主键。所以你得到的是一个损坏的数据模型,因为没有主键它就不能是关系的,这就是为什么它很难与 ORM 一起使用。您可以通过定义代理键来解决此问题。

          【讨论】:

            【解决方案6】:

            你最好把这个注释去掉

            @Table(name = "TB_MAIN")

            我以前用过类似的课。你可以看看我的 github 存储库 https://github.com/celalaygar/Spring-Boot-2/tree/master/Spring-Boot-13-SpringData-3-JPA-Hibernate-PostgreSQL/src/main/java/com/example/demo/entity

            @Embeddable
            public class CarDetails {
                @Column(name="details")
                private String Details;
            }
            
            @Entity
            @Table(name = "car")
            public class Car {
                @Id
                @GeneratedValue(strategy = GenerationType.AUTO)
                private Long id;
            
                @Column(name = "name")
                private String name;
            
                @Column(name = "model")
                private int model;
            
                private CarDetails car_details;
            
                public Car() {
                }
            
                public Car(String name, int model) {
                    super();
                    this.name = name;
                    this.model = model;
                }
            
                public Long getId() {
                    return id;
                }
            
                public void setId(Long id) {
                    this.id = id;
                }
            
                public String getName() {
                    return name;
                }
            
                public void setName(String name) {
                    this.name = name;
                }
            
                public int getModel() {
                    return model;
                }
            
                public void setModel(int model) {
                    this.model = model;
                }
                @Embedded
                public CarDetails getCar_details() {
                    return car_details;
                }
            
                public void setCar_details(CarDetails car_details) {
                    this.car_details = car_details;
                }
            

            }

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-30
              • 1970-01-01
              • 1970-01-01
              • 2018-01-21
              • 1970-01-01
              • 1970-01-01
              • 2020-08-21
              相关资源
              最近更新 更多