Sprig错误:使用@OneToMany或@ManyToMany定位到一个未映射的类

huangapple 未分类评论49阅读模式
英文:

Sprig Error : Use of @OneToMany or @ManyToMany targeting an unmapped class

问题

以下是翻译的代码部分:

QuoteDetailsDTO.java:

import javax.persistence.*;

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

    // ... (其他属性的定义和 getter/setter 方法)

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

    // ... (其他方法)
}

ClientInfoDTO.java:

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;

    // ... (其他属性的定义和 getter/setter 方法)

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

    // ... (其他方法)
}

ApplicationConfiguration.java:

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

请注意,这些是您提供的代码的翻译版本,其中包括实体类以及应用程序配置。如果您还有其他问题或需要进一步的帮助,请随时提问。

英文:

I'm working on a small Spring project, I'm trying to join two objects but I keep getting an org.hibernate.AnnotationException error when I try to start up the project, I've mapped both entities too. It works well when I don't add the joins but bombs out when I do.

My one DTO looks like this:

import javax.persistence.*;

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

    @Column(name = &quot;LEAD_ID&quot;)
    private String leadId;

    @Column(name = &quot;ADULT_DEPENDENTS&quot;)
    private String adultDependents;

    @Column(name = &quot;CHILD_DEPENDENTS&quot;)
    private String childDependents;

    @Column(name = &quot;QUOTE_TCS_ACCEPTED&quot;)
    private String quoteTCsAccepted;

    @Column(name = &quot;PRODUCT_TCS_ACCEPTED&quot;)
    private String productTCsAccepted;

    @Column(name = &quot;LJP_APPLICABLE&quot;)
    private String LjpApplicable;

    @Column(name = &quot;QUOTE_DATE&quot;)
    private String quoteDate;

    @Column(name = &quot;NOTIFICATION_ID&quot;)
    private String notificationId;

    @Column(name = &quot;QUOTE_PDF_REF&quot;)
    private String quotePDFRef;

    @Column(name = &quot;QUOTE_CSV_REF&quot;)
    private String quoteCSVRef;

    @Column(name = &quot;AGENT_ENTITY&quot;)
    private String agentEntity;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = ClientInfoDTO.class)
    @JoinColumn(name = &quot;CLIENT_ID&quot;, 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;
    }
}

And the other like this:

import javax.persistence.*;

import java.util.List;

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

    @Column(name = &quot;EMAIL_ADDRESS&quot;)
    private String emailAddress;

    @Column(name = &quot;CONTACT_NUMBER&quot;)
    private String contactNumber;

    @Column(name = &quot;FIRST_NAME&quot;)
    private String firstName;

    @Column(name = &quot;LAST_NAME&quot;)
    private String lastName;

    @Column(name = &quot;ID_TYPE&quot;)
    private String idType;

    @Column(name = &quot;ID_NUMBER&quot;)
    private String idNumber;

    @Column(name = &quot;ENTITY_NUMBER&quot;)
    private String entityNumber;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = &quot;clientInfoDTO&quot;, cascade = CascadeType.ALL)
    private List&lt;QuoteDetails&gt; quoteDetails;

    public List&lt;QuoteDetails&gt; getQuoteDetails() {
        return quoteDetails;
    }

    public void setQuoteDetails(List&lt;QuoteDetails&gt; 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;
    }
}

With the ApplicationConfiguration set up like this:

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

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

        return sessionFactory;
    }

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

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

        return dataSource;
    }

    @Bean(name = &quot;transactionManager&quot;)
    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(&quot;hibernate.dialect&quot;, env.getProperty(&quot;spring.jpa.database-platform&quot;));
        properties.put(&quot;hibernate.show_sql&quot;, true);
        properties.put(&quot;hibernate.format_sql&quot;, true);
        properties.put(&quot;hibernate.hbm2ddl.auto&quot;, &quot;create&quot;);

        return properties;
    }

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

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

        return transactionTemplate;
    }

Update:

My Tables look like this (I'm using a h2 database):

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)
    )

The org.hibernate.AnnotationException stack trace:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;sessionFactory&#39; 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

这是准确的代码吗?

从错误信息以及您的类中观察,特别是这部分:

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

您在使用类名为QuoteDetails,而您的实体类名应为QuoteDetailsDTO

英文:

Is this the exact code?

Looking at the error and then to your classes, specifically this part:

@OneToMany(fetch = FetchType.LAZY, mappedBy = &quot;clientInfoDTO&quot;, cascade = CascadeType.ALL)
private List&lt;QuoteDetails&gt; quoteDetails;

You are using class QuoteDetails when your entity class is named QuoteDetailsDTO?

huangapple
  • 本文由 发表于 2020年5月4日 04:02:08
  • 转载请务必保留本文链接:https://java.coder-hub.com/61580871.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定