hibernate 一对多 参照非主键 插入数据库

NHibernate One-to-Many一对多映射-xxlinux_com 立即下载

**

hibernate 单向多对一 参照非主键 插入数据库

当插入数据库记录时,报出外键约束的问题。

表结构如下

其中两张表中id都为业务逻辑无关主键,major表中的 institute_id参照 Institute表中的institute_id, 而Institute表中的institute_id并非主键。

如果你子表参照主表的字段是主键时,就可能不会有一下的错误

-- -----------------------------------------------------
-- Table Institute
-- -----------------------------------------------------
DROP TABLE  Institute ;

CREATE TABLE  Institute(
  id INT NOT NULL IDENTITY,
  institute_id VARCHAR(20) NOT NULL UNIQUE,
  institute_name VARCHAR(45) NOT NULL UNIQUE,
  bean VARCHAR(20) NOT NULL,
  major_amount INT NOT NULL,
  PRIMARY KEY (id))




-- -----------------------------------------------------
-- Table Major
-- -----------------------------------------------------
DROP TABLE Major ;

CREATE TABLE Major (
  id INT NOT NULL IDENTITY,
  major_id VARCHAR(20) NOT NULL UNIQUE,
  major_name VARCHAR(45) NOT NULL,
  institute_id VARCHAR(20),
  PRIMARY KEY (id),
  CONSTRAINT fk_tb_major_tb_institute1
    FOREIGN KEY (institute_id)
    REFERENCES SMS_Institute (institute_id)
	ON DELETE CASCADE
    ON UPDATE  CASCADE)

通过hibernate方向生成的实体类
关联为多对一,major表管理institute表

Institute.class

package com.domain;

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

/**
 * Institute entity. @author MyEclipse Persistence Tools
 */

public class SmsInstitute implements java.io.Serializable {

	// Fields

	private Integer id;
	private String instituteId;
	private String instituteName;
	private String bean;
	private Integer majorAmount;
    //getter和setter方法省略
}

institute.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.domain.Institute" table="SMS_Institute" >
    
     	<!--业务逻辑无关主键 ,自增-->
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity"></generator>
        </id>
        
        <!--学院ID -->
        <property name="instituteId" type="java.lang.String">
            <column name="institute_id" length="20" not-null="true" unique="true" />
        </property>

		<!--学院名称-->
        <property name="instituteName" type="java.lang.String">
            <column name="institute_name" length="45" not-null="true" unique="true" />
        </property>

		<!--院长-->
        <property name="bean" type="java.lang.String">
            <column name="bean" length="20" not-null="true" />
        </property>

		<!--专业数量-->
        <property name="majorAmount" type="java.lang.Integer">
            <column name="major_amount" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Major.class

package com.domain;

/**
 * SmsMajor entity. @author MyEclipse Persistence Tools
 */

public class SmsMajor implements java.io.Serializable {

	// Fields

	private Integer id;
	private String majorId;
	private String majorName;
	private SmsInstitute institute;
 	//getter和setter方法省略
}

major.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="com.domain.SmsMajor" table="Major" >

		<!--业务逻辑无关主键 ,自增-->
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="identity"></generator>
		</id>

		<!--专业ID-->
		<property name="majorId" type="java.lang.String">
			<column name="major_id" length="20" not-null="true" unique="true" />
		</property>

		<!--专业姓名-->
		<property name="majorName" type="java.lang.String">
			<column name="major_name" length="45" not-null="true" />
		</property>
		
		<!--单向多对一映射-->
		<many-to-one name="institute" class="com.domain.SmsInstitute" property-ref="instituteId">
			<column name="institute_id" ></column>
		</many-to-one>
	</class>
</hibernate-mapping>

其中many-to-one中的属性property-ref="instituteId"起到重要作用,把外键参考的值指向institute表中的institute_id字段。(ps:可能不设置property-ref属性的话,hibernate会把外键参考的值指向institute表中的主键,也就是我设置的业务逻辑无关主键,从而曝出外键约束错误。可能可能可能,重要的事情说三遍,我也不太确定)

往数据库中插入新纪录

public int insertMajor(String majorId, String majorName, String instituteId) {
		// TODO Auto-generated method stub
		try{
		Session sess=HibernateUtils.getSession();//获取session
		sess.beginTransaction();//开启事务
		InstituteDAOImpl sidi= newInstituteDAOImpl();
		Institute si= sidi.selectByInstituteId(instituteId);//获取所参照学院的对象
		
		//实例化专业对象
		Major major= new Major();
		major.setMajorId(majorId);
		major.setMajorName(majorName);
		major.setInstitute(si);//设置major属性
		sess.save(major);//将专业对象保存到数据库
		sess.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			return 0;//返回值判断是否插入成功
		}
		
		return 1;

如过many-to-one中没有设置属性property-ref的值,会报外键约束错误,错误提示如下

org.hibernate.util.JDBCExceptionReporter logExceptions
严重: INSERT 语句与 FOREIGN KEY 约束"fk_tb_major_tb_institute1"冲突。该冲突发生于数据库"SMS",表"Institute", column ‘institute_id’。
org.hibernate.exception.ConstraintViolationException: could not insert: [com.domain.Major]

设置好many-to-one中的属性property-ref的值,就不会报错。

Hibernate一对多使用非主键关联设置 Hibernate一对多使用非主键关联设置,参看详细说明 立即下载

相关推荐

MySQL外键约束的实例讲解

MySQL的外键约束是用来在两个表之间建立链接的,其中一个表发生变化,另外一个表也发生变化。从这个特点来看,它主要是为了保证表数据的一致性和完整性的。 对于两个通过外键关联的表,相关联字段中主键所在的表是主表,也称之为父表,外键所在的表是从表,也称之为子表,定义外键的时候需要遵守几个规则: 1、父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照。 2、必须为父表定义主键。 3、主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 4、外键中列的数

hibernate用注解(一对多,多对一)关联两个表的非主键列(非主属性)--详解,亲测

今天遇到两个表要相互关联,且两个表的关联字段都是非主属性的情况。 一般情况下我们是用: @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "user_userId")。 public User getUser() { return user; } //这是Address类,需要与User类关...

待到春花烂漫时 1万+

无迹卡尔曼滤波(UKF)推导

提出,使用了一种不同的方法来计算误差协方差矩阵。它不使用(连续时间)黎卡提方程(Riccati Equations,形如。的一类非线性方程)或(离散时间)协方差传播和更新规律。关键的思想是基于一组特殊的样本点来估计误差协方差,这些点被称为。无迹卡尔曼滤波(Unscented Kalman Filter),最初由。点(Sigma Points),这些点直接通过原始非线性模型传播。无迹变换表示有三个特殊样本点的高斯分布,称为。

生活如此美好,致敬每一个热爱“热爱”的人! 1778

mysql插入数据忽略主键

使用mysqldump会导致id重复 INSERT INTO order_info (user_id,product_name,productor) SELECT user_id,product_name,productor FROM order_info;

qq_40396818的博客 1988

Flutter连接蓝牙打印机打印(含中文、双排打印)

Flutter连接蓝牙打印机打印(含中文、双排打印)

Session_W的博客 701

STM32 Nucleo-144开发板开箱bring-up

最近做项目,用到STM32F446ZET6这款MCU,为了赶进度,前期软件需要提前开发,于是在某宝买了对应主控的官方开发板,为了避免遗忘,后面能翻出来回忆一些细节,就形成了本篇的主要内容,同时也希望能够帮助刚上手的小伙伴少走弯路,如果对你有帮助请点赞、收藏、转发,谢谢!

汽车电子软件领域知识分享 2680

在数据库中添加自增字段值。该字段是非主键。

insert into table_name(uid) values(@@IDENTITY+1);

miss_ok的博客 2249

千兆以太网 PCB 设计实战:4层板 100Ω 差分对布线,EMI 降低 6dB 实测

本文详细解析了千兆以太网 PCB 设计中的关键技术与实战经验,重点介绍了4层板上100Ω差分对的优化布线方法,通过实测数据展示了EMI降低6dB的有效方案。内容涵盖层叠设计、阻抗计算、布线技巧及EMI抑制措施,为硬件工程师提供了一套完整的高速电路设计解决方案。

weixin_29175469的博客 428

insert 数据库插入数据但是不填写主键内容

主键,不允许为空,如果处理数据时未写明id列的数值,则数据是无法插入到数据库中的,oracle一般建议是采用序列的方式,MySQL则采用自增的方式 唯一约束允许为空 ...

qq_45178972的博客 5642

数字电路基础(CMOS电路、低功耗方法)

文章目录一、CMOS器件1.1.CMOS反相器1.2. CMOS与非门1.3.CMOS或非门1.4 CMOS与门和CMOS或门二、CMOS电路参数——功耗 一、CMOS器件 1.1.CMOS反相器 CMOS反相器实现非门功能,由一个PMOS管和一个NMOS管组成,其逻辑电路图如下: 其真值表如下: In PMOS NMOS Out 0 √ 导通 ×关闭 1 1 ×关闭 √...

Mr.翟的博客 1万+

Qt 【window udp 高频采集丢包问题】

使用Asio + 无锁队列或者环形缓存区方案可以解决 qt udp 在window平台高速采集 (128k)丢包问题。

weixin_45397344的博客 177

Hibernate的映射关系与级联(一对一、一对多、多对多)

Hibernate的映射关系与级联(一对一、一对多、多对多) 长期专业踩坑,现记录点滴,望提升自我,为祖国软件事业作贡献(害羞脸) 1、主键一对多示例 2、非主键一对多示例 3、主键多对多示例 4、非主键多对多示例 5、主键一对一示例 6、非主键一对一示例 7、双向示例 8、单向示例

iamzhuwh 1548

CRMEB开源电商系统 /api/products SQL注入漏洞复现(CVE-2024-36837)

2024年6月,CRMEB开源电商系统发布了新补丁,修复了一处SQL注入漏洞(CVE-2024-36837)。经分析,该漏洞可以通过请求api的路径接口来进行SQL注入,进而可能导致敏感信息泄露,该注入可暴露后台web绝对路径,深入利用可获取服务器权限,该漏洞无前置条件且利用简单,建议受影响的用户尽快修复漏洞。

0xSec 2883

Hibernate:one-to-many(一对多)关联映射详解

对one-to-many关联映射进行论述

SirouW的博客 3477

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

hibernate级联操 同时向2张表插入数据(一对多的关联,一个简单的例子说明)

一、在emp配置中和dept配置中要同时维护好多对一和一对多的关系。        Emp部门表中有个属性是将dept这个对象作为属性的。        在dept中是有一个hashSet集合属性的,因为一个部门有多个员工,所以在部门表中放了一个一emp对象为泛型的hashSet集合 [java] view plain copy   p

pwh309315228的博客 8182

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

单向一对多和双向一对多

《深入浅出Hibernate》中对单向一对多和双向一对多进行了一些介绍,其中提到:“由于是单向关联,为了保持关联关系,只能通过主控方对被控方进行及联更新。”也就是说,对被关联对象进行任何操作,都只能通过主控方进行及联更新。附书中例子:(其中TUser为主控方,TAddress为被控方)     Transaction tx = session.beginTransaction();    TAdd

神经病院 6759

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JPA简单对一对多关系的数据进行插入,先一后多

JPA和HIBERNATE均属于ORM框架,两者在使用上也很相似,尤其是原理上。除了这两种操作DB的工具外,我们还可能使用到Serialization 、JDBC、ODB 、EJB2 、JDO等。         此处仅简单通过JPA插入一对关系数据进行了解JPA的使用。对于一对多关系,从Object角度将,关系可能维护在多的一方,也可能维护在一的一方;从DBTable的角度将,则是多的一方维护

指尖思维 5223

Hibernate 中把一对多关系的数据保存到数据库

用Hibernate做持久层的时候,在保存一对多关系的数据的时候,把主表端的inverse设为true,在JAVA对象里把关联做成双向,一次保存主表,效率最高. 下面以往主表保存一条数据,子表保存两条数据为例:  1,通过保存主表的方式,inverse设为true,JAVA对象做双向关联,通过跟踪Hibernate的SQL,发现一共有三次insert操作. 如果不将子表方关联到主表方(将子表

交换一个思想,能得到俩思想 1万+

Hibernate @OneToMany 一对多注解

配置一 @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="fatherID") //对应儿子类的哪个字段 子类中配置ManyToOne的字段名称 private Set<Child> children; 配置二 @OneToMany(mappedBy ...

275

Hibernate 关联映射之---- 一对多双向映射

指定引用至自身的外键表中的外键 -->

徐靖峰的专栏 535

Hibernate:one-to-one(一对一)关联映射详解

对one-to-one关联映射进行详细的叙述

SirouW的博客 3021

Hibernate 一对多出现低级问题因为po实现了hashcode和equals方法这里设置的Id做比较...

1.Hibernate中一对多的双向关联     &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate...

iteye_15118的博客 1463

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,(一对一,一对多,多对多)一对一关系:可以选择任意一方插入外键(one-to-one:one-to-one<--->many-to-one[unique='true'])一对多关系:在多的一端插入一端的主键为外键(one-to-many<--...

chongne6396的博客 94

jpa之hibernate4.2.4之双向关联之一对一、一对多、多对多

hibernate版本4.2.4      oracle 版本11g 本文主要涉及到以下几个知识点:     1.双向关联之一对一     2.双向关联之一对多     3.双向关联之多对多 对于双向关联其实有几个步骤(个人总结,如有不对,欢迎吐槽)     a.要建立双方关联,首先要各自拥有对方对象     b.指明关系维护端与关系被维护端 指明两者的级联关系    c

undergrowth的专栏 4886
下一篇: SSH 将后台获取的对象放到页面中
M2L
M2L
博客等级 码龄10年 12粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值