有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

导致错误的java ManyToOne关系无法解析表的绑定

我在定义Hibernate实体时遇到了一个问题。 定义如下:

实体同意:

@Entity
@Table(name = "Consent", schema = "OPTIO")
public class Consent {
    @Id
    @GeneratedValue(generator = "sequence-generator")
    @Column(name = "Id" , columnDefinition="unique, NOT NULL")
    private Integer Id;
    @Column(nullable=false)
    private Date CreatedOnUtc;

    @NotNull
    @ManyToOne(optional=false, fetch = FetchType.EAGER)
    @JoinColumn(name="DisclaimerId", referencedColumnName = "Id", nullable=false, insertable=true, updatable=false)
    private Disclaimer Disclaimer;

实体免责声明:

@Entity
@Table(name="DISCLAIMER", schema="OPTIO")
public class Disclaimer {
    @Id
    @GeneratedValue(generator = "sequence-generator2")
    @Column(name = "Id" , columnDefinition="unique NOT NULL")
    private Integer Id;
    @Column(nullable = false)
    private String Name;

应用程序无法加载。EntityManagerFactory定义引发异常

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [C:\EclipseWorkspace2021-JDK15\optioversion3\src\test\resources\optio_beans_test.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: optio_persistence_unit] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalStateException: Could not resolve binding for table `Consent`
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:142)
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:95)
    at com.netsol.optioversion3.test.OPTIOTestDriver.main(OPTIOTestDriver.java:62)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: optio_persistence_unit] Unable to build Hibernate SessionFactory; nested exception is java.lang.IllegalStateException: Could not resolve binding for table `Consent`
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
    ... 12 more
Caused by: java.lang.IllegalStateException: Could not resolve binding for table `Consent`
    at org.hibernate.sql.ast.tree.from.AbstractColumnReferenceQualifier.resolveTableReference(AbstractColumnReferenceQualifier.java:43)
    at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.createTableGroupJoin(ToOneAttributeMapping.java:572)
    at org.hibernate.sql.ast.tree.from.TableGroupJoinProducer.createTableGroupJoin(TableGroupJoinProducer.java:31)
    at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.createTableGroupJoin(ToOneAttributeMapping.java:518)
    at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.lambda$generateFetch$0(ToOneAttributeMapping.java:425)
    at org.hibernate.sql.ast.spi.FromClauseAccess.resolveTableGroup(FromClauseAccess.java:59)
    at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:422)
    at org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.generateFetch(ToOneAttributeMapping.java:61)
    at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$createFetchableBiConsumer$8(LoaderSelectBuilder.java:645)
    at org.hibernate.loader.ast.internal.LoaderSelectBuilder.lambda$visitFetches$7(LoaderSelectBuilder.java:526)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.hibernate.persister.entity.AbstractEntityPersister.visitFetchables(AbstractEntityPersister.java:6412)
    at org.hibernate.loader.ast.internal.LoaderSelectBuilder.visitFetches(LoaderSelectBuilder.java:525)
    at org.hibernate.loader.ast.internal.LoaderSqlAstCreationState.visitFetches(LoaderSqlAstCreationState.java:138)
    at org.hibernate.sql.results.graph.AbstractFetchParent.afterInitialize(AbstractFetchParent.java:30)
    at org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.<init>(EntityResultImpl.java:52)
    at org.hibernate.sql.results.graph.entity.internal.EntityResultImpl.<init>(EntityResultImpl.java:34)
    at org.hibernate.persister.entity.AbstractEntityPersister.createDomainResult(AbstractEntityPersister.java:1234)
    at org.hibernate.loader.ast.internal.LoaderSelectBuilder.generateSelect(LoaderSelectBuilder.java:335)
    at org.hibernate.loader.ast.internal.LoaderSelectBuilder.createSelect(LoaderSelectBuilder.java:132)
    at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.createLoadPlan(SingleIdEntityLoaderStandardImpl.java:179)
    at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.prepare(SingleIdEntityLoaderStandardImpl.java:53)
    at org.hibernate.persister.entity.AbstractEntityPersister.prepareLoader(AbstractEntityPersister.java:4467)
    at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:4458)
    at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.finishInitialization(MappingMetamodelImpl.java:214)
    at org.hibernate.metamodel.internal.RuntimeMetamodelsImpl.finishInitialization(RuntimeMetamodelsImpl.java:47)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:304)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1263)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
    ... 16 more

任何帮助都将不胜感激:

如果我将FetchType更改为LAZY,它会加载,但在插入Consent表项时会失败。 在将FetchType设置为LAZY并从JoinColumn中删除@NotTNull但传递一个空的Disclaimer实例时,它似乎工作正常,新行被插入/创建到底层的Oracle数据库中


共 (1) 个答案

  1. # 1 楼答案

    如果查看生成的语句以创建表:

    create table consent (id unique, NOT NULL not null, disclaimer_id unique NOT NULL not null, primary key ...)
    

    你会看到id unique, NOT NULL not null和两个not null。原因是您在主键列上同时使用了@IdcolumnDefinition = "unique NOT NULL"。这会导致生成上述错误生成的表创建语句

    你应该删除columnDefinition = "unique NOT NULL"部分,因为你不需要这个。您已经在使用@Id注释

    这两个表都适用。您应该同时更新ConsentDisclaimer类中的Id字段

    更新:

    同意。爪哇

    @Entity
    @Table(name = "Consent", schema = "OPTIO")
    public class Consent {
        @Id
        @GeneratedValue(generator = "sequence-generator")
        @Column(name = "Id")
        private Integer Id;
        
        //...
    }
    

    免责声明。爪哇

    @Entity
    @Table(name = "DISCLAIMER", schema = "OPTIO")
    public class Disclaimer {
        @Id
        @GeneratedValue(generator = "sequence-generator2")
        @Column(name = "Id")
        private Integer Id;
        
        //...
    }
    

    您可以简单地将下面的两行添加到应用程序中。属性文件以查看控制台上生成的SQL语句:

    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type=TRACE