Ошибка веточки: использование @OneToMany или @ManyToMany для целевого класса - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над небольшим проектом Spring, пытаюсь объединить два объекта, но у меня появляется ошибка org.hibernate.AnnotationException , когда я пытаюсь запустить проект. сопоставил обе сущности тоже. Это хорошо работает, когда я не добавляю соединения, а когда делаю бомбы.

Мой один DTO выглядит так:

import javax.persistence.*;

@Entity(name = "quoteDetailsDTO")
@Table(name = "QUOTE_DETAILS")
public class QuoteDetailsDTO {
    @Id
    @Column(name = "QUOTE_ID", length = 36)
    private String quoteId;

    @Column(name = "LEAD_ID")
    private String leadId;

    @Column(name = "ADULT_DEPENDENTS")
    private String adultDependents;

    @Column(name = "CHILD_DEPENDENTS")
    private String childDependents;

    @Column(name = "QUOTE_TCS_ACCEPTED")
    private String quoteTCsAccepted;

    @Column(name = "PRODUCT_TCS_ACCEPTED")
    private String productTCsAccepted;

    @Column(name = "LJP_APPLICABLE")
    private String LjpApplicable;

    @Column(name = "QUOTE_DATE")
    private String quoteDate;

    @Column(name = "NOTIFICATION_ID")
    private String notificationId;

    @Column(name = "QUOTE_PDF_REF")
    private String quotePDFRef;

    @Column(name = "QUOTE_CSV_REF")
    private String quoteCSVRef;

    @Column(name = "AGENT_ENTITY")
    private String agentEntity;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = ClientInfoDTO.class)
    @JoinColumn(name = "CLIENT_ID", nullable = false)
    private ClientInfoDTO clientInfoDTO;

    public ClientInfoDTO getClientInfoDTO() {
        return clientInfoDTO;
    }

    public void setClientInfoDTO(ClientInfoDTO clientInfoDTO) {
        this.clientInfoDTO = clientInfoDTO;
    }

    public String getQuoteId() {
        return quoteId;
    }

    public void setQuoteId(String quoteId) {
        this.quoteId = quoteId;
    }

    public String getLeadId() {
        return leadId;
    }

    public void setLeadId(String leadId) {
        this.leadId = leadId;
    }

    public String getAdultDependents() {
        return adultDependents;
    }

    public void setAdultDependents(String adultDependents) {
        this.adultDependents = adultDependents;
    }

    public String getChildDependents() {
        return childDependents;
    }

    public void setChildDependents(String childDependents) {
        this.childDependents = childDependents;
    }

    public String getQuoteTCsAccepted() {
        return quoteTCsAccepted;
    }

    public void setQuoteTCsAccepted(String quoteTCsAccepted) {
        this.quoteTCsAccepted = quoteTCsAccepted;
    }

    public String getProductTCsAccepted() {
        return productTCsAccepted;
    }

    public void setProductTCsAccepted(String productTCsAccepted) {
        this.productTCsAccepted = productTCsAccepted;
    }

    public String getLjpApplicable() {
        return LjpApplicable;
    }

    public void setLjpApplicable(String ljpApplicable) {
        LjpApplicable = ljpApplicable;
    }

    public String getQuoteDate() {
        return quoteDate;
    }

    public void setQuoteDate(String quoteDate) {
        this.quoteDate = quoteDate;
    }

    public String getNotificationId() {
        return notificationId;
    }

    public void setNotificationId(String notificationId) {
        this.notificationId = notificationId;
    }

    public String getQuotePDFRef() {
        return quotePDFRef;
    }

    public void setQuotePDFRef(String quotePDFRef) {
        this.quotePDFRef = quotePDFRef;
    }

    public String getQuoteCSVRef() {
        return quoteCSVRef;
    }

    public void setQuoteCSVRef(String quoteCSVRef) {
        this.quoteCSVRef = quoteCSVRef;
    }

    public String getAgentEntity() {
        return agentEntity;
    }

    public void setAgentEntity(String agentEntity) {
        this.agentEntity = agentEntity;
    }
}

А другой вот так:

import javax.persistence.*;

import java.util.List;

@Entity(name = "clientInfoDTO")
@Table(name = "CLIENT_INFO")
public class ClientInfoDTO {
    @Id
    @Column(name = "CLIENT_ID", length = 36)
    private String clientId;

    @Column(name = "EMAIL_ADDRESS")
    private String emailAddress;

    @Column(name = "CONTACT_NUMBER")
    private String contactNumber;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;

    @Column(name = "ID_TYPE")
    private String idType;

    @Column(name = "ID_NUMBER")
    private String idNumber;

    @Column(name = "ENTITY_NUMBER")
    private String entityNumber;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "clientInfoDTO", cascade = CascadeType.ALL)
    private List<QuoteDetails> quoteDetails;

    public List<QuoteDetails> getQuoteDetails() {
        return quoteDetails;
    }

    public void setQuoteDetails(List<QuoteDetails> quoteDetails) {
        this.quoteDetails = quoteDetails;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getIdType() {
        return idType;
    }

    public void setIdType(String idType) {
        this.idType = idType;
    }

    public String getIdNumber() {
        return idNumber;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public String getEntityNumber() {
        return entityNumber;
    }

    public void setEntityNumber(String entityNumber) {
        this.entityNumber = entityNumber;
    }
}

С настройкой ApplicationConfiguration следующим образом:

 @Bean
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource, Properties hibernateProperties) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan("xxx.xxx.xxx.xxx.xxx.model");
        sessionFactory.setHibernateProperties(hibernateProperties);

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource(ConfigurationClient configurationClient) {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));

        return dataSource;
    }

    @Bean(name = "transactionManager")
    public HibernateTransactionManager hibernateTransactionManager(LocalSessionFactoryBean sessionFactory, DataSource dataSource) {
        HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();

        hibernateTransactionManager.setSessionFactory(sessionFactory.getObject());
        hibernateTransactionManager.setDataSource(dataSource);

        return hibernateTransactionManager;
    }

    @Bean
    public Properties hibernateProperties(ConfigurationClient configurationClient) {
        Properties properties = new Properties();

        properties.put("hibernate.dialect", env.getProperty("spring.jpa.database-platform"));
        properties.put("hibernate.show_sql", true);
        properties.put("hibernate.format_sql", true);
        properties.put("hibernate.hbm2ddl.auto", "create");

        return properties;
    }

    @Bean
    public TransactionTemplate transactionTemplate(HibernateTransactionManager hibernateTransactionManager) {
        TransactionTemplate transactionTemplate = new TransactionTemplate();

        transactionTemplate.setTransactionManager(hibernateTransactionManager);
        transactionTemplate.setTimeout(30);

        return transactionTemplate;
    }

Обновление:

Мои таблицы выглядят так (я использую базу данных h2):

create table CLIENT_INFO (
       CLIENT_ID varchar(36) not null,
        CONTACT_NUMBER varchar(255),
        EMAIL_ADDRESS varchar(255),
        ENTITY_NUMBER varchar(255),
        FIRST_NAME varchar(255),
        ID_NUMBER varchar(255),
        ID_TYPE varchar(255),
        LAST_NAME varchar(255),
        primary key (CLIENT_ID)
    );

create table QUOTE_DETAILS (
       QUOTE_ID varchar(36) not null,
        LJP_APPLICABLE varchar(255),
        ADULT_DEPENDENTS varchar(255),
        AGENT_ENTITY varchar(255),
        CHILD_DEPENDENTS varchar(255),
        CLIENT_ID varchar(255),
        LEAD_ID varchar(255),
        NOTIFICATION_ID varchar(255),
        PRODUCT_TCS_ACCEPTED varchar(255),
        QUOTE_CSV_REF varchar(255),
        QUOTE_DATE varchar(255),
        QUOTE_PDF_REF varchar(255),
        QUOTE_TCS_ACCEPTED varchar(255),
        primary key (QUOTE_ID)
    )

org.hibernate. AnnotationException трассировка стека:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [xxx/xxx/xxx/xxx/xxx/configuration/ApplicationConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: xxx.xxx.xxx.xxx.xxx.model.ClientInfoDTO.quoteDetails[xxx.xxx.xxx.xxx.xxx.model.QuoteDetails]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1708)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:581)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724)
    ... 45 more
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: xxx.xxx.xxx.xxx.xxx.model.ClientInfoDTO.quoteDetails[xxx.xxx.xxx.xxx.xxx.model.QuoteDetails]
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1243)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:725)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1589)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:535)
    at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704)
    ... 56 more

1 Ответ

1 голос
/ 04 мая 2020

Это точный код?

Рассматривая ошибку, а затем свои классы, в частности эту часть:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "clientInfoDTO", cascade = CascadeType.ALL)
private List<QuoteDetails> quoteDetails;

Вы используете класс QuoteDetails, когда ваш класс сущности называется QuoteDetailsDTO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...