一对一关系 attempted to assign id from null one-to-one

本文介绍Hibernate中实现一对一关联的方法,并详细解释如何通过XML配置文件设置主键关联,包括属性设置、注意事项及效率问题。

one-to-one在hibernate中可以用来作为两张表之间的主键关联,这也是hibernate中主键关联的一种用法,这样在一张表中的ID,在生成另外一张表的同时回自动插入到相应的ID字段中去,相应的XML文件设置比较简单,举例如下:

    <!-- 建立一对一的到Address的映射,这个是写在User的XML配置文件中的 -->

    <!-- 相应的User bean(PO)中也要添加属性 com.xx.Address  address-->

    <one-to-one name="address" cascade="all" class="com.xx.Address"/>

   

   <!-- cascade的属性设置不再重复了,可以查看hibernate文档 -->

    <!-- 建立一对一的到User的映射,这个是写在Address的XML配置文件中的 -->

    <!-- 相应的Address bean(PO)中也要添加属性 com.xx.User user--> -->

    <one-to-one name="user" class="com.xx.User" constrained="true"/>

      为了在Address中使用User中的主键ID值,我们需要设置Address中的主键生成规则,如下所示,采用foreign关键字

   <id column="ID" name="id" type="long" unsaved-value="0">

      <generator class="foreign">

        <param name="property">user</param> 

      </generator>

   </id>

      这里需要注意的是property的属性值必须与上面到User的映射所填写的name属性值一致,这样就完成了one-to-one的映射关系。

上面的过程都很简单,下面我来说说这里需要注意的地方:

  1.   在设置属性ID的时候必须注意字段的长度,如笔者这样使用oracle的sequence来生成ID,其长度有14位之长,则应选择hibernate类型long,对应的实体中应选择Long,这样不会出现溢出的情况。

  2.   在测试的时候必须要注意这两张表之间因为已经存在了一对一的关系,所以我们不能只写

         user.setAddress(address);

         而忽略了

         address.setUser(user);

         这样在做插入的时候会报出attempted to assign id from null one-to-one property: address的错误,这一点初学者会经常犯,笔者也是其中之一。

 3.   如果不写cascade="all"或者写成cascade="none"的话,即使你写了

         user.setAddress(address);

         address.setUser(user);

       也不会发生任何事情,只有user会被存储。

4. one-to-one的效率问题-------one-to-one在查询时,总是查出和主表关联的表,而且one-to-one的lazy属性只有false proxy no-proxy三种,没有true。outer-join="false"也只是徒增查询语句条数,把本来的一条sql语句变成多条。所以在one-to-one这种一对一的关系不是很强的情况下(one-to-one关系强即总是查出这所有的几个关联表),或者是在一张表中存在多个one-to-one的情况下,使用最好one-to-many来代替one-to-one。

### 解决 Simulink Stateflow 错误:'All selected data/events/messages will be created in the char' 和 'Attempted to assign to input' 在 Simulink 的 Stateflow 环境中,遇到错误 `'All selected data/events/messages will be created in the char'` 和 `'Attempted to assign to input'` 时,通常与数据类型、事件定义以及输入信号的赋值方式有关。以下是针对这些问题的详细分析和解决方案[^1]。 #### 数据类型问题 Stateflow 中的数据类型需要明确指定,特别是在处理字符类型(`char` 或 `string`)时。如果未正确配置数据类型,可能会导致上述错误。确保以下几点: - 在 Stateflow 编辑器中,通过“Model Explorer”检查所有相关数据的类型。如果需要使用字符类型,应将数据类型设置为 `char` 或 `string`。 - 如果数据是从外部输入传递到 Stateflow 图中,则需确保外部信号的数据类型与 Stateflow 内部定义一致[^2]。 ```matlab % 示例代码:在 MATLAB 命令窗口中验证数据类型 data = 'Hello'; % 定义一个字符串 whos data; % 检查变量 data 的类型 ``` #### 输入信号赋值问题 错误 `'Attempted to assign to input'` 表明尝试对输入信号进行赋值操作,而输入信号通常是只读的。解决方法如下: - 避免直接对输入信号进行赋值操作。如果需要修改输入信号的值,可以通过中间变量或输出信号实现。 - 使用 Stateflow 的动作语句来更新状态机内部的数据,而不是直接操作输入信号。 ```matlab % 示例代码:避免直接对输入信号赋值 in_signal = 'Test'; % 假设 in_signal 是输入信号 temp_var = in_signal; % 创建临时变量 temp_var = strcat(temp_var, '_updated'); % 修改临时变量 out_signal = temp_var; % 将结果赋值给输出信号 ``` #### 事件和消息的配置 事件和消息的定义也需要仔细检查。如果事件或消息携带的数据类型不匹配,可能会引发类似的错误。确保以下内容: - 对于事件,检查其参数类型是否为 `char` 或 `string`,并确保触发条件正确。 - 对于消息,确认发送方和接收方的消息数据类型一致,并且消息的内容符合字符格式要求。 ```matlab % 示例代码:发送一条包含字符的消息 msg = 'Hello, Stateflow'; send(msg); ``` #### 模型配置参数 最后,检查 Simulink 模型的配置参数,确保支持 Stateflow 的数据类型设置。特别是对于较旧版本的 MATLAB,可能需要手动启用某些选项以支持 `string` 类型[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值