hibernate一对多映射

本文详细介绍了在数据库映射中一对多关联关系的配置与使用,包括单向一对多的具体实现过程及其在Hibernate框架中的配置方法。

在关联关系的映射中使用得最多的就是一对多的关联,一对多的关联关系分为两种:单向一对多,双向一对多。下面分别对这两种情况进行总结:

首先准备两张表:用户表user和用户组表group

CREATE TABLE  `test`.`group` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) 


CREATE TABLE  `test`.`user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  `group_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`),
  KEY `FK_users_1` (`group_id`),
  CONSTRAINT `FK_users_1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`)
) 

首先,来看看单向一对多的情况:

Group类中有如下属性:

private Integer id;
private String name;
private Set users = new HashSet(0);//用户的set集合,用于存一对多中的“多”的一方

 User类只需要有本身的属性即可:

	private Integer id;
	private String name;

 接下来才是重点,配置单向一对多之间的关联

Group.hbm.xml文件的配置如下:

<hibernate-mapping>
    <class name="com.stream.model.Group" table="group" catalog="test">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true" />
        </property>
                <!-- 以下是单向一对多的配置信息-->
        <set name="users" inverse="false" cascade="all">
            <key>
                <!-- 指定user表中引用外键的是哪一列-->
                <column name="group_id"/>
            </key>
            <!--配置是与哪一个类之间的一对多 -->
            <one-to-many class="com.stream.model.User" />
        </set>
    </class>
</hibernate-mapping>

 在该配置文件中,inverse可以使用默认false,或者显示指定false,如以上代码。这样就指定一对多之间的关系由group这个POJO来维护。在单项一对多关联中,这一点很重要,下面我们通过测试来说明。cascade="all"指定级联的之间的等级,它具有如下几种值:

all : 所有情况下均进行关联操作。 
none:所有情况下均不进行关联操作。这是默认值。 
save-update:在执行save/update/saveOrUpdate时进行关联操作。 
delete:在执行delete时进行关联操作。

user.hbm.xml文件的配置与User这个类一样,不需要包含如何关于关联关系的配置:

<class name="com.stream.model.User" table="user" catalog="test">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="45" not-null="true" />
        </property>
</class>

 下面只举单向一对多关联保存一例来说明,其他操作类似:

                
                Group group = new Group();
		group.setName("group1");
		User user1  = new User();
		user1.setName("stream");
		User user2 = new User();
		user2.setName("fangqi");
                //添加用户
		group.getUsers().add(user1);
		group.getUsers().add(user2);
                //开启事务
		Transaction transaction =session.beginTransaction();
		//保存用户组
                session.save(group);
                //将缓冲区中的sql送到数据库中
		session.flush();
                //提交事务
		transaction.commit();

 我们没有显示的插入user1和uesr2两条记录,但是由于我们设置了cascade=all,那么在group表进行任何操作时都会关联到user表,即在保存group时,也会把user1和user2保存,这就是级联为我们带来的好处。

但是,在这里有两点需要说明的是:

1、如果在Group.hbm.xml映射文件中设置了inverse=true,那么说明这个一对多的关联关系由多的一方来维护。而在单向的一对多关联中,“多”的一方完全不知情,所以在保存往user 表中插入的两条数据,其外键group_id这一字段都是为null值。如果user表中group_id是not null的话就会出现如下异常:

org.hibernate.exception.GenericJDBCException: could not insert: [com.stream.model.User]

....

Caused by: java.sql.SQLException: Field 'group_id' doesn't have a default value。

异常信息室group_id这个字段没有设置一个默认值,其实就是我们往group_id这个非空的字段插入了一个null值。

2、如果再Group.hbm.xml映射文件中设置inverse=false,或者不设置该属性,即表示由自身来维护这个关联关系。但在保存group后,会先将user1和user2插入到数据库,并且group_id的值都为null。然后再接着两条update语句,将这两天记录的group_id字段值设置为前面插入的group的id。同样的如果user 表中group_id字段是非空的,仍然会出现上面的异常。

---------------------------------------------单向一对多的关联完毕----------------------------------------------------------

双向一对多的关联下次有时间再总结。

 

 

基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值