7.Hibernate一对多关系建立与错误解决

本文详细解析了在Hibernate框架中如何配置一对多的表关系,包括数据库表结构设计、实体类创建、映射文件配置及常见错误排查,帮助开发者理解和解决实际开发中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对多表关系在hibernate中的配置

1.数据库建表

创建用户表以及联系人表,其中一个用户对应多个联系人,联系人外键参照于用户表的主键

创建cst_customer表

CREATE TABLE IF NOT EXISTS cst_customer(
  cst_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
  cst_name VARCHAR(32) NOT NULL COMMENT '客户名称',
  cst_source VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
  cst_industry VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
  cst_level VARCHAR(32) DEFAULT NULL COMMENT '客户所属级别',
  cst_phone VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
  cst_mobile VARCHAR(14) DEFAULT NULL COMMENT '移动电话'
);
复制代码

创建cst_linkman表

CREATE TABLE IF NOT EXISTS cst_linkman(
  lkm_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '联系人ID',
  lkm_name VARCHAR(32) DEFAULT NULL COMMENT '联系人名字',
  lkm_gender VARCHAR(32) DEFAULT NULL COMMENT '联系人关系',
  lkm_phone VARCHAR(64) DEFAULT NULL COMMENT '联系人固定电话',
  lkm_mobile VARCHAR(14) DEFAULT NULL COMMENT '联系人移动电话',
  lkm_email VARCHAR(64) DEFAULT NULL COMMENT '联系人邮箱',
  lkm_qq VARCHAR(32) DEFAULT NULL COMMENT '联系人qq',
  lkm_position VARCHAR(64) DEFAULT NULL COMMENT '联系人地址',
  lkm_memo VARCHAR(32) DEFAULT NULL COMMENT '联系人成员',
  lkm_cust_id BIGINT,
  FOREIGN KEY (lkm_cust_id) REFERENCES cst_customer(cst_id) ON UPDATE NO ACTION ON DELETE NO ACTION
);
复制代码

建表成功后如下图所示

2.创建实体
2.1创建cst_customer实体
package com.classes;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Transient;

public class cst_customer {
	private long cst_id;
	private String cst_name;
	private String cst_source;
	private String cst_industry;
	private String cst_level;
	private String cst_phone;
	private String cst_mobile;
	
	private Set<cst_linkman> linkmans = new HashSet<cst_linkman>();

	public long getCst_id() {
		return cst_id;
	}
	public void setCst_id(long cst_id) {
		this.cst_id = cst_id;
	}
	public String getCst_name() {
		return cst_name;
	}
	public void setCst_name(String cst_name) {
		this.cst_name = cst_name;
	}
	public String getCst_source() {
		return cst_source;
	}
	public void setCst_source(String cst_source) {
		this.cst_source = cst_source;
	}
	public String getCst_industry() {
		return cst_industry;
	}
	public void setCst_industry(String cst_industry) {
		this.cst_industry = cst_industry;
	}
	public String getCst_level() {
		return cst_level;
	}
	public void setCst_level(String cst_level) {
		this.cst_level = cst_level;
	}
	public String getCst_phone() {
		return cst_phone;
	}
	public void setCst_phone(String cst_phone) {
		this.cst_phone = cst_phone;
	}
	public String getCst_mobile() {
		return cst_mobile;
	}
	public void setCst_mobile(String cst_mobile) {
		this.cst_mobile = cst_mobile;
	}
	public Set<cst_linkman> getLinkmans() {
		return linkmans;
	}
	public void setLinkmans(Set<cst_linkman> linkmans) {
		this.linkmans = linkmans;
	}
}
复制代码
2.2创建cst_linkman实体
package com.classes;

import javax.persistence.Transient;

public class cst_linkman {
	private long lkm_id;
	private String lkm_name;
	private String lkm_gender;
	private String lkm_phone;
	private String lkm_mobile;
	private String lkm_email;
	private String lkm_qq;
	private String lkm_position;
	private String lkm_memo;
	
	private cst_customer cst_customer;
	
	public cst_customer getCst_customer() {
		return cst_customer;
	}
	public void setCst_customer(cst_customer cst_customer) {
		this.cst_customer = cst_customer;
	}
	public long getLkm_id() {
		return lkm_id;
	}
	public void setLkm_id(long lkm_id) {
		this.lkm_id = lkm_id;
	}
	public String getLkm_name() {
		return lkm_name;
	}
	public void setLkm_name(String lkm_name) {
		this.lkm_name = lkm_name;
	}
	public String getLkm_gender() {
		return lkm_gender;
	}
	public void setLkm_gender(String lkm_gender) {
		this.lkm_gender = lkm_gender;
	}
	public String getLkm_phone() {
		return lkm_phone;
	}
	public void setLkm_phone(String lkm_phone) {
		this.lkm_phone = lkm_phone;
	}
	public String getLkm_mobile() {
		return lkm_mobile;
	}
	public void setLkm_mobile(String lkm_mobile) {
		this.lkm_mobile = lkm_mobile;
	}
	public String getLkm_email() {
		return lkm_email;
	}
	public void setLkm_email(String lkm_email) {
		this.lkm_email = lkm_email;
	}
	public String getLkm_qq() {
		return lkm_qq;
	}
	public void setLkm_qq(String lkm_qq) {
		this.lkm_qq = lkm_qq;
	}
	public String getLkm_position() {
		return lkm_position;
	}
	public void setLkm_position(String lkm_position) {
		this.lkm_position = lkm_position;
	}
	public String getLkm_memo() {
		return lkm_memo;
	}
	public void setLkm_memo(String lkm_memo) {
		this.lkm_memo = lkm_memo;
	}
	
}
复制代码
3.创建映射关系

在这里需要注意的是我使用的是eclipse中默认的那个工具所配置的,在这里是有一个大坑的,在后面会讲到,但是前面还是按照他默认的来进行配置

cst_customer映射表对应生成的代码如下

<hibernate-mapping>
    <class name="com.classes.cst_customer" table="CST_CUSTOMER">
        <id name="cst_id" type="long">
            <column name="CST_ID" />
            <generator class="assigned" />
        </id>
        <property name="cst_name" type="java.lang.String">
            <column name="CST_NAME" />
        </property>
        <property name="cst_source" type="java.lang.String">
            <column name="CST_SOURCE" />
        </property>
        <property name="cst_industry" type="java.lang.String">
            <column name="CST_INDUSTRY" />
        </property>
        <property name="cst_level" type="java.lang.String">
            <column name="CST_LEVEL" />
        </property>
        <property name="cst_phone" type="java.lang.String">
            <column name="CST_PHONE" />
        </property>
        <property name="cst_mobile" type="java.lang.String">
            <column name="CST_MOBILE" />
        </property>
        <set name="linkmans" table="CST_LINKMAN" inverse="false" lazy="true">
            <key>
                <column name="CST_ID" />
            </key>
            <one-to-many class="com.classes.cst_linkman" />
        </set>
    </class>
</hibernate-mapping>
复制代码

cst_linkman映射表对应生成的代码如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 5, 2018 2:55:37 PM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.classes.cst_linkman" table="CST_LINKMAN">
        <id name="lkm_id" type="long">
            <column name="LKM_ID" />
            <generator class="assigned" />
        </id>
        <property name="lkm_name" type="java.lang.String">
            <column name="LKM_NAME" />
        </property>
        <property name="lkm_gender" type="java.lang.String">
            <column name="LKM_GENDER" />
        </property>
        <property name="lkm_phone" type="java.lang.String">
            <column name="LKM_PHONE" />
        </property>
        <property name="lkm_mobile" type="java.lang.String">
            <column name="LKM_MOBILE" />
        </property>
        <property name="lkm_email" type="java.lang.String">
            <column name="LKM_EMAIL" />
        </property>
        <property name="lkm_qq" type="java.lang.String">
            <column name="LKM_QQ" />
        </property>
        <property name="lkm_position" type="java.lang.String">
            <column name="LKM_POSITION" />
        </property>
        <property name="lkm_memo" type="java.lang.String">
            <column name="LKM_MEMO" />
        </property>
        <many-to-one name="cst_customer" class="com.classes.cst_customer" fetch="join">
            <column name="CST_CUSTOMER" />
        </many-to-one>
    </class>
</hibernate-mapping>
复制代码
4.将映射文件添加到配置文件中,配置文件所对应的代码如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">lwhong1017</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myblog?useSSL=true</property>
        <property name="hibernate.connection.username">root</property>
        <mapping resource="com/classes/cst_customer.hbm.xml"/>
        <mapping resource="com/classes/cst_linkman.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
复制代码
5.编写测试代码

DBuitls中代码如下

package com.HibernateUtils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.classes.cst_customer;
import com.classes.cst_linkman;

public class DButils {
	private static SessionFactory sessionFactory;
	private static Session session;
	public static Session getSession() {
		return session;
	}

	public static void setSession(Session session) {
		DButils.session = session;
	}

	static {
		Configuration configuration = new Configuration().configure();
		sessionFactory = configuration.buildSessionFactory();
	}
	static {
		session = sessionFactory.openSession();
	}
	
	public void SaveData() {
		System.out.println("aaaaa----");
		Session session = this.getSession();
		Transaction transaction = session.beginTransaction();
		// 创建一个客户
		cst_customer cst_customer = new cst_customer();
		cst_customer.setCst_name("赵云");
		// 创建两个联系人
		cst_linkman cst_linkman1 = new cst_linkman();
		cst_linkman1.setLkm_name("李秘书");
		cst_linkman cst_linkman2 = new cst_linkman();
		cst_linkman2.setLkm_name("王秘书");
		// 建立联系s
		cst_customer.getLinkmans().add(cst_linkman1);
		cst_customer.getLinkmans().add(cst_linkman2);
		cst_linkman1.setCst_customer(cst_customer);
		cst_linkman2.setCst_customer(cst_customer);
		session.save(cst_customer);
		session.save(cst_linkman1);
		session.save(cst_linkman2);
		transaction.commit();
		System.out.println("bbbbb----");
	}

}
复制代码

在main方法中调用

DButils dButils = new DButils();
dButils.SaveData();
复制代码
6.错误
6.1A different object with the same identifier value was already associated with the session
18/03/05 15:17:55 INFO orm.connections: HHH10001003: Autocommit mode: false
18/03/05 15:17:55 INFO internal.DriverManagerConnectionProviderImpl: HHH000115: Hibernate connection pool size: 20 (min=1)
18/03/05 15:17:55 INFO dialect.Dialect: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
aaaaa----
Exception in thread "main" org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.classes.cst_linkman#0]
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:165)
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
	at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
	at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
	at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
	at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:679)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:671)
	at org.hibernate.internal.SessionImpl.save(SessionImpl.java:666)
	at com.HibernateUtils.DButils.SaveData(DButils.java:49)
	at com.Test.TestHibMutiTabPro.main(TestHibMutiTabPro.java:10)
复制代码

这行代码报错意思是在session中已经存在两个相同OID的对象在里面,因此而导致的错误,我在这里一开始也是去谷歌解决方法的,但是其实并没有什么好的解决方案,因此我在这里用排除法,在这里有相同的OID只能是我那里添加了两个联系人,所以我决定将cst_linkman2注销看看会出什么问题

6.2Unknown column in 'field list'
aaaaa----
18/03/05 15:26:28 WARN spi.SqlExceptionHelper: SQL Error: 1054, SQLState: 42S22
18/03/05 15:26:28 ERROR spi.SqlExceptionHelper: Unknown column 'CST_CUSTOMER' in 'field list'
18/03/05 15:26:28 INFO internal.AbstractBatchImpl: HHH000010: On release of batch it still contained JDBC statements
18/03/05 15:26:28 ERROR internal.SessionImpl: HHH000346: Error during managed flush [could not execute statement]
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2886)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386)
	at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
	at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
	at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
	at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
	at com.HibernateUtils.DButils.SaveData(DButils.java:50)
	at com.Test.TestHibMutiTabPro.main(TestHibMutiTabPro.java:10)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'CST_CUSTOMER' in 'field list'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2494)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
	... 19 more
复制代码

果然第一个的相同OID的问题没有了,但是又出现了新的问题,通过查找资料这个地方意思是CST_CUSTOMER找不到没有存在这样的属性,首先来分析一下这个CST_CUSTOMER可是cst_linkman实体中的成员属性,cst_linkman所对应数据库中的表确实是没有这样的一个列属性,只有一个外键的,而数据库表与实体的对应关系是由hbm配置文件来决定的,所以可能出现的问题就在配置文件那个地方,因此我决定将原来的many-to-one这里将原来的cst_customer修改成lkm_cust_id,这个外键在表中可是实实在在存在的 原:

<many-to-one name="cst_customer" class="com.classes.cst_customer" fetch="join">
            <column name="CST_CUSTOMER" />
        </many-to-one>
复制代码

现:

<many-to-one name="cst_customer" class="com.classes.cst_customer" fetch="join">
            <column name="lkm_cust_id" />
        </many-to-one>
复制代码

再次运行报如下错误

6.3Cannot add or update a child row: a foreign key constraint fails
18/03/05 15:39:30 INFO dialect.Dialect: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
aaaaa----
18/03/05 15:39:31 WARN spi.SqlExceptionHelper: SQL Error: 1452, SQLState: 23000
18/03/05 15:39:31 ERROR spi.SqlExceptionHelper: Cannot add or update a child row: a foreign key constraint fails (`myblog`.`cst_linkman`, CONSTRAINT `cst_linkman_ibfk_1` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cst_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
18/03/05 15:39:31 INFO internal.AbstractBatchImpl: HHH000010: On release of batch it still contained JDBC statements
18/03/05 15:39:31 ERROR internal.SessionImpl: HHH000346: Error during managed flush [could not execute statement]
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2886)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386)
	at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
	at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
	at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
	at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
	at com.HibernateUtils.DButils.SaveData(DButils.java:50)
	at com.Test.TestHibMutiTabPro.main(TestHibMutiTabPro.java:10)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`myblog`.`cst_linkman`, CONSTRAINT `cst_linkman_ibfk_1` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cst_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2494)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
	... 19 more
复制代码

这个问题似乎是因为其他问题导致的问题了,但是需要注意的是导致这个问题的原因是还有上面那个,不过先来排除导致这个问题的主要问题,从网上查找资料显示的问题就是

原因:
设置的外键和对应的另一个表的主键值不匹配。
解决方法:
找出不匹配的值修改。
或者清空两表数据。
复制代码

这也的几句话对于新手来说真不懂是怎么回事,但是其实说的直白一点就是表与表之间值对不上啊,而两者之间有对应关系的就是那个外键了,在customer中id的主键属性是assign的,将其修改为native

再次报错

aaaaa----
18/03/05 15:48:57 WARN spi.SqlExceptionHelper: SQL Error: 1054, SQLState: 42S22
18/03/05 15:48:57 ERROR spi.SqlExceptionHelper: Unknown column 'CST_ID' in 'field list'
18/03/05 15:48:57 INFO internal.AbstractBatchImpl: HHH000010: On release of batch it still contained JDBC statements
18/03/05 15:48:57 ERROR internal.SessionImpl: HHH000346: Error during managed flush [could not execute statement]
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute statement
	at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
复制代码

有了上面6.2的解决方式其实就能明白是cst_customer映射表中column有问题 原:

<set name="linkmans" table="CST_LINKMAN" inverse="false" lazy="true">
            <key>
                <column name="CST_ID" />
            </key>
            <one-to-many class="com.classes.cst_linkman" />
        </set>
复制代码

这里所对应的是cst_id去了,但实际上所对应的应该是外键lkm_cust_id,修改后成如下

<set name="linkmans" table="CST_LINKMAN" inverse="false" lazy="true">
            <key>
                <column name="lkm_cust_id" />
            </key>
            <one-to-many class="com.classes.cst_linkman" />
        </set>
复制代码

再次运行没有报错误了,但是要知道这里所调试的是一个用户表customer中只添加了一个linkman记录的,要是一对多的话还需要将linkman2注释打开,再次打开注释运行是没有问题的,通过查询数据库表数据没有问题,因此出现6.1所示问题时需要检查其他配置是不是有问题,特别是主键生成策略 WiHongNoteBook

转载于:https://juejin.im/post/5c27326751882542026dba48

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值