Я не могу создать свой репозиторий, потому что у меня нет @Id - PullRequest
0 голосов
/ 11 марта 2020

Мне нужно сделать «CRUD» с таблицей, но таблица в базе данных не имеет первичного ключа, поэтому я затем изменил @Entity на @Embeddable. Теперь у меня есть проблема с моим @ репозиторием.

@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

Как я могу это исправить?

Ответы [ 6 ]

3 голосов
/ 11 марта 2020

Невозможно иметь сущности без первичного ключа, а Embeddables может жить только внутри сущности.

Вам необходимо создать первичный ключ в сущности, используя столбцы из вашей таблицы, которые образуют уникальный ключ.

1 голос
/ 11 марта 2020

вам лучше убрать эту аннотацию

@ 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;
    }

}

1 голос
/ 11 марта 2020

Это не просто Spring-data-JPA - реляционная модель данных требует первичных ключей. Итак, у вас есть поврежденная модель данных, потому что без первичного ключа она не может быть реляционной, и поэтому ее трудно использовать с ORM. Вы можете исправить это, определив суррогатный ключ.

1 голос
/ 11 марта 2020

@ Embeddable аннотация используется для объявления того, что класс будет внедрен другим объектом. Проверка для @ EmbeddedId : я ссылался на hibernate docs Hiberate 3.5 аннотации ссылка

1 голос
/ 11 марта 2020
  1. Лучшее решение - добавить первичный ключ в вашу таблицу.
  2. Вы можете добавить аннотацию @Id ко всем полям вашего класса. Но используйте этот обходной путь осторожно, потому что он может применяться только тогда, когда вы собираетесь читать данные, в случае вставки hibernate сгенерирует оператор update SQL, если в базе данных есть такая же запись.
1 голос
/ 11 марта 2020

Вы правильно используете @Entity, чтобы обозначить это как таблицу. Вам нужно использовать @Id в одном поле, чтобы указать, что это первичный ключ в вашей таблице. У каждого стола должен быть один. @Embeddable для другой цели. Например, см. Ниже.

@Id
@Column(name = "EXPOSURE")
private String exposureType;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...