java 列不能为空无法插入

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16462267/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 23:01:52  来源:igfitidea点击:

Column cannot be null could not insert

javahibernatehibernate-mapping

提问by Alexandrovich

dear developers.

亲爱的开发者。

I'm going to ask you a question which I think hard to solve for me just because I don't know the basic why to answer, what I mean?? Let's see. The associations in JBoss documentations did not get the comprehensive answer: Why I should use JoinTable instead of Foreign Keyand I do not completely understand how mappings works, What do I mean by this? I know what is association are ManyToMany or ManyToOne etc. and for what aims they are, but how they work's and collaborate with each otherdon't need an answer about bi-directional or unidirectional or joinTable or associations, I would like to have the link where I can find full info about my two questions:

我要问你一个我认为很难解决的问题只是因为我不知道基本的为什么要回答,我的意思是什么?让我们来看看。JBoss 文档中的关联没有得到全面的答案:为什么我应该使用 JoinTable 而不是外键并且我不完全理解映射的工作原理,我这是什么意思?我知道什么是多对多或多对一等关联,以及它们的目的是什么,但是它们如何工作和相互协作不需要关于双向或单向或 joinTable 或关联的答案,我想要我可以在这里找到有关我的两个问题的完整信息的链接:

1) Why I should use JoinTable instead of Foreign Key????

1)为什么我应该使用 JoinTable 而不是外键????

2) how entity work's and collaborate with each other(without explanations what is manyToMany etc. associations and bi or unidirectional associations are)???

2)实体如何工作和相互协作(不解释什么是多对多等关联和双向或单向关联)???

So, I have piece of code where I stuck because misunderstanding, I'm just trying to insert data I'm MYSQL database: Name_INSTITUTION and TYPE_NAME(Type of institution):*

所以,我有一段代码因为误解而卡住了,我只是想插入数据我是 MYSQL 数据库:Name_INSTITUTION 和 TYPE_NAME(机构类型):*

  • My entity class:

    @Entity 
    @Table(name="INSTITUTION")
    
    public class Institution implements Serializable{
    
    private static final long serialVersionUID = -7636394097858726922L;
    
    
    private int Id;
    
        @Id
        @GeneratedValue(strategy=IDENTITY)
        @Column(name="ID")
        public int getId() {
            return Id;
        }
        public void setId(int id) {
            Id = id;
        }
    
    
    private int Version;
    
        @javax.persistence.Version
        @Column(name="VERSION")
        public int getVersion() {
            return Version;
        }
        public void setVersion(int version) {
            Version = version;
        }
    
    
    private String Name_Institution;
    
        @Column(name="NAME_INSTITUTION")
        public String getName_Institution() {
            return Name_Institution;
        }
        public void setName_Institution(String name_Institution) {
            Name_Institution = name_Institution;
        }
    
    
    private Type type_inInstitution;
    
        @ManyToOne  
        @Cascade(org.hibernate.annotations.CascadeType.ALL)
        @JoinTable(name="TYPE_INSTITUTION", 
                                        joinColumns=@JoinColumn(name="INSTITUTION_ID"),
                                        inverseJoinColumns=@JoinColumn(name="TYPE_ID"))
        public Type getType_inInstitution() {
            return type_inInstitution;
        }
        public void setType_inInstitution(Type type_inInstitution) {
            this.type_inInstitution = type_inInstitution;
        }
    

    }

  • My second entity class:

    @Entity
    @Table(name="TYPE")
    
    public class Type implements Serializable {
    
    
    private static final long serialVersionUID = -4246217431412815552L;
    
    private String type;
    
        public Type(){}
    
        public Type(String type) {
        this.type = type;   
    
        }       
    
    private int Type_Id;
    
        @Id
        @GeneratedValue(strategy=IDENTITY)
        @Column(name="ID")
        public int getType_Id() {
            return Type_Id;
        }
        public void setType_Id(int type_Id) {
            Type_Id = type_Id;
        }
    
    
    private String Type_Name;
    
        @Column(name="TYPE_NAME")
        public String getType_Name() {
            return Type_Name;
        }
    
        public void setType_Name(String type_Name) {
            Type_Name = type_Name;
        }
    
    
    private int Version;
    
        @Version
        @Column(name="VERSION")
        public int getVersion() {
            return Version;
        }
        public void setVersion(int version) {
            Version = version;
        }
    
    
    
    private  Set<Institution> set_Institution_inType = new HashSet<Institution>();
    
        @OneToMany
        @JoinTable(name="TYPE_INSTITUTION",                                     joinColumns=@JoinColumn(name="TYPE_ID"),                                            inverseJoinColumns=@JoinColumn(name="INSTITUTION_ID"))
        public Set<Institution> getSet_Institution_inType() {
            return set_Institution_inType;
        }
        public void setSet_Institution_inType(Set<Institution> set_Institution_inType) {
            this.set_Institution_inType = set_Institution_inType;
        }
    
        public void addType(Institution institution) {
            institution.setType_inInstitution(this);
                   getSet_Institution_inType().add(institution);
    
        }
    

    }

    The DAO Class:

    @Repository("daoInsertDataInterface")
    @Transactional
    
    public class InsertDataService implements DaoInsertDataInterface{
    
    private org.apache.commons.logging.Log log=  LogFactory.getLog(InsertDataService.class);
    
    private SessionFactory sessionFactory;
    
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        @Resource(name="sessionFactory")
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
    
    @Override
    public Institution insertData(Institution institution) {
        sessionFactory.getCurrentSession().saveOrUpdate(institution);
        log.info(institution.getId());
        return institution;
    
    }
    

    }

  • My metada config:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
    <property name="url"><value>${jdbc.connectionValues}</value></property>
    <property name="username"><value>${jdbc.userName}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
    </bean>
    
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref ="sessionFactory"/>
    </bean>
    
    <context:property-placeholder location="connection.properties"/>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <context:component-scan base-package="edu.demidov.dom, edu.demidov.dao" />
    
    <context:annotation-config />
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref ="dataSource"/>
    <property name="packagesToScan" value="edu.demidov.dom"/>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
    <prop key="hibernate.max_fetch_depth">3</prop>
    <prop key="hibernate.jdbc.fetch_size">50</prop>
    <prop key="hibernate.jdbc.batch_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    
    </bean>
    

  • And the error:

  • 我的实体类:

    @Entity 
    @Table(name="INSTITUTION")
    
    public class Institution implements Serializable{
    
    private static final long serialVersionUID = -7636394097858726922L;
    
    
    private int Id;
    
        @Id
        @GeneratedValue(strategy=IDENTITY)
        @Column(name="ID")
        public int getId() {
            return Id;
        }
        public void setId(int id) {
            Id = id;
        }
    
    
    private int Version;
    
        @javax.persistence.Version
        @Column(name="VERSION")
        public int getVersion() {
            return Version;
        }
        public void setVersion(int version) {
            Version = version;
        }
    
    
    private String Name_Institution;
    
        @Column(name="NAME_INSTITUTION")
        public String getName_Institution() {
            return Name_Institution;
        }
        public void setName_Institution(String name_Institution) {
            Name_Institution = name_Institution;
        }
    
    
    private Type type_inInstitution;
    
        @ManyToOne  
        @Cascade(org.hibernate.annotations.CascadeType.ALL)
        @JoinTable(name="TYPE_INSTITUTION", 
                                        joinColumns=@JoinColumn(name="INSTITUTION_ID"),
                                        inverseJoinColumns=@JoinColumn(name="TYPE_ID"))
        public Type getType_inInstitution() {
            return type_inInstitution;
        }
        public void setType_inInstitution(Type type_inInstitution) {
            this.type_inInstitution = type_inInstitution;
        }
    

    }

  • 我的第二个实体类:

    @Entity
    @Table(name="TYPE")
    
    public class Type implements Serializable {
    
    
    private static final long serialVersionUID = -4246217431412815552L;
    
    private String type;
    
        public Type(){}
    
        public Type(String type) {
        this.type = type;   
    
        }       
    
    private int Type_Id;
    
        @Id
        @GeneratedValue(strategy=IDENTITY)
        @Column(name="ID")
        public int getType_Id() {
            return Type_Id;
        }
        public void setType_Id(int type_Id) {
            Type_Id = type_Id;
        }
    
    
    private String Type_Name;
    
        @Column(name="TYPE_NAME")
        public String getType_Name() {
            return Type_Name;
        }
    
        public void setType_Name(String type_Name) {
            Type_Name = type_Name;
        }
    
    
    private int Version;
    
        @Version
        @Column(name="VERSION")
        public int getVersion() {
            return Version;
        }
        public void setVersion(int version) {
            Version = version;
        }
    
    
    
    private  Set<Institution> set_Institution_inType = new HashSet<Institution>();
    
        @OneToMany
        @JoinTable(name="TYPE_INSTITUTION",                                     joinColumns=@JoinColumn(name="TYPE_ID"),                                            inverseJoinColumns=@JoinColumn(name="INSTITUTION_ID"))
        public Set<Institution> getSet_Institution_inType() {
            return set_Institution_inType;
        }
        public void setSet_Institution_inType(Set<Institution> set_Institution_inType) {
            this.set_Institution_inType = set_Institution_inType;
        }
    
        public void addType(Institution institution) {
            institution.setType_inInstitution(this);
                   getSet_Institution_inType().add(institution);
    
        }
    

    }

    DAO 类:

    @Repository("daoInsertDataInterface")
    @Transactional
    
    public class InsertDataService implements DaoInsertDataInterface{
    
    private org.apache.commons.logging.Log log=  LogFactory.getLog(InsertDataService.class);
    
    private SessionFactory sessionFactory;
    
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        @Resource(name="sessionFactory")
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
    
    @Override
    public Institution insertData(Institution institution) {
        sessionFactory.getCurrentSession().saveOrUpdate(institution);
        log.info(institution.getId());
        return institution;
    
    }
    

    }

  • 我的元数据配置:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
    <property name="url"><value>${jdbc.connectionValues}</value></property>
    <property name="username"><value>${jdbc.userName}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
    </bean>
    
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref ="sessionFactory"/>
    </bean>
    
    <context:property-placeholder location="connection.properties"/>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <context:component-scan base-package="edu.demidov.dom, edu.demidov.dao" />
    
    <context:annotation-config />
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref ="dataSource"/>
    <property name="packagesToScan" value="edu.demidov.dom"/>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
    <prop key="hibernate.max_fetch_depth">3</prop>
    <prop key="hibernate.jdbc.fetch_size">50</prop>
    <prop key="hibernate.jdbc.batch_size">10</prop>
    <prop key="hibernate.show_sql">true</prop>
    </props>
    </property>
    
    </bean>
    

  • 和错误:

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [app-context.xml] INFO : org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-330 'javax.inject.Named' annotation found and supported for component scanning INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@c93274: startup date [Thu May 09 11:38:23 EDT 2013]; root of context hierarchy INFO : org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from class path resource [connection.properties] INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1b9c2f0: defining beans [dataSource,transactionManager,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,daoInsertDataInterface,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,sessionFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor];

root of factory hierarchy Hibernate: insert into TYPE (TYPE_NAME, VERSION) values (?, ?) WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000 ERROR: org.hibernate.util.JDBCExceptionReporter - Column 'TYPE_NAME' cannotbe null Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [edu.demidov.dom.Type] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2327) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2834) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:282) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) at edu.demidov.dao.InsertDataService.insertData(InsertDataService.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy22.insertData(Unknown Source) at edu.demidov.dao.AppTEst.main(AppTEst.java:22) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'TYPE_NAME' cannot be nullat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 44 more SS

信息:org.springframework.beans.factory.xml.XmlBeanDefinitionReader - 从类路径资源 [app-context.xml] 加载 XML bean 定义信息:org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-330 'javax.inject.Named ' 找到并支持组件扫描信息的注释:org.springframework.context.support.GenericXmlApplicationContext - 刷新 org.springframework.context.support.GenericXmlApplicationContext@c93274:启动日期 [2013 年 5 月 9 日星期四 11:38:23 EDT];上下文层次结构的根信息:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - 从类路径资源加载属性文件 [connection.properties] 信息:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.注入.注入'

工厂层次结构的根 Hibernate:插入 TYPE(TYPE_NAME,VERSION)值(?,?)警告:org.hibernate.util.JDBCExceptionReporter - SQL 错误:1048,SQLState:23000 错误:org.hibernate.util.JDBCExceptionReporter - Column ' TYPE_NAME'不能线程“main”中的异常为空 org.hibernate.exception.ConstraintViolationException:无法插入:[edu.demidov.dom.Type] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate .exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 在 org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) ) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2834) 在 org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) 在 org.hibernate.engine.ActionQueue.execute(ActionQueue. java:273) 在 org.hibernate.event.def。AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320) 位于 org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) 位于 org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedEventListener.saveWithGeneratedEventListener.java:320 .hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 在 org.hibernate.eventOrUpdateOrUpdateEventListener.java:195(DefaultSaveOrUpdateEventListener.java:210) .java:117) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 在 org.hibernate.impl。SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) at org.hibernate。 engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate .engine.Cascade.cascade(Cascade.java:161) 在 org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450) 在 org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:450) ) 在 org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) 在 org.hibernate.event.def。AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityOrUpdateEventListener.entityOrUpdateEventListener.entityOrUpdateEventListener.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)at .hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 在 org.hibernate.impl.SessionImpl.fireImpl.OrjavaUpdate(DefaultSaveOrUpdateEventListener.java:117) :685) 在 org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 在 org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) 在 edu.demidov.dao。InsertDataService.insertData(InsertDataService.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(ImplatingMethod:ImplatingMethod) 43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) at org.springframework .transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed. 172) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在 $Proxy22.insertData(Unknown Source) 在 edu.demidov.dao.AppTEst.main(AppTEst.java:22)java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy22.insertData(Unknown Source) at edu.demidov.dao.AppTEst.main(AppTEst.java:22)java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy22.insertData(Unknown Source) at edu.demidov.dao.AppTEst.main(AppTEst.java:22) 引起:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“TYPE_NAME”不能为空在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.reflectConstructor .newInstance(Constructor.java:525) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386) 在 com.mysql.jdbc。 SQLError.createSQLException(SQLError.java:1041) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc .MysqlIO.sendCommand(MysqlIO.java:2503) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) 在 com.mysql.jdbc.ConnectionImpl。execSQL(ConnectionImpl.java:2815) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement .executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org. id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 44 更多 SSexecuteUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org.hibernate .insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 44 更多 SSexecuteUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org.hibernate .insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 44 更多 SS

Thank you, guys.

感谢你们。

采纳答案by JB Nizet

Why I should use JoinTable insted of Foreign Key?

为什么我应该使用 JoinTable 插入外键?

You should not. You have the choice. If you prefer using a join table, use a join table. If you prefer using a join column (foreign key in the child table), use a join column. If you have an already existing schema that you can't change, choose the option that corresponds to the existing schema.

你不应该。你有选择。如果您更喜欢使用连接表,请使用连接表。如果您更喜欢使用连接列(子表中的外键),请使用连接列。如果您有一个无法更改的现有架构,请选择与现有架构对应的选项。

how entity work's and collaborate with each other

实体如何工作和相互协作

I'm not sure what you mean by that. If an entity School has a OneToMany association with an entity Teacher, when you get a school from the session, and ask for its teachers, Hibernate will load them from the database for you. If you add a teacher to the collection of teachers of a school, Hibernate will populate the join column or the join table for you. The goal is simply to manipulate objects as if theyr were simple objects stored in memory, and have Hibernate load and save them for you from/to the database.

我不确定你的意思。如果实体 School 与实体 Teacher 有 OneToMany 关联,当您从 session 中获取 school 并询问其老师时,Hibernate 会为您从数据库中加载它们。如果您将教师添加到学校的教师集合中,Hibernate 会为您填充连接列或连接表。目标是简单地操作对象,就好像它们是存储在内存中的简单对象一样,并让 Hibernate 为您从/向数据库加载和保存它们。

Now regarding the exception and the title of your question, the exception message says it clearly:

现在关于异常和问题的标题,异常消息清楚地说明了:

insert into TYPE (TYPE_NAME, VERSION) values (?, ?) WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000 ERROR: org.hibernate.util.JDBCExceptionReporter - Column 'TYPE_NAME' cannot be null

插入 TYPE (TYPE_NAME, VERSION) 值 (?, ?)

You're trying to insert an antity of type Type (what a badly chosen name!) with a null name. And the database column doesn't acept null. So you get this exception. Either change the table definition if null is a valid Type name, or fix your code to make sure you don't try to insert a null name.

您正试图插入一个带有空名称的 Type 类型(多么糟糕的名称!)。并且数据库列不接受空值。所以你会得到这个例外。如果 null 是有效的类型名称,则更改表定义,或者修复您的代码以确保您不会尝试插入空名称。

Also, respect the Java naming conventions. Your code is really hard to read.

此外,请遵守 Java 命名约定。你的代码真的很难读。