从含关联表的主表操作嵌入式表报错及相关技术问询
问题解决与疑问解答
先解决当前报错
报错原因是SmsGateway类的用法错误:
- 你把
@EmbeddedId用在了Integer类型的pushCode上,但SmsGateway本身是@Embeddable类,且主实体SMSCompleteData已经通过@SecondaryTable将sms_gateway_parameters与主表pushcode通过push_cd关联,嵌入式类不需要自己定义主键。 - 同时,嵌入式类的字段需要指定对应的secondary table,否则Hibernate会默认把字段放到主表。
修改后的SmsGateway.java
@Data @ToString @Embeddable @AllArgsConstructor @NoArgsConstructor public class SmsGateway { // 移除@EmbeddedId,因为主表的push_cd已经作为关联主键 @Column(name="push_cd", table="sms_gateway_parameters") Integer pushCode; @Column(name="ctype", table="sms_gateway_parameters") Integer ctype; @Column(name="dcode", table="sms_gateway_parameters") String dcode; @Column(name="subuid", table="sms_gateway_parameters") String subuid; @Column(name="pwd", table="sms_gateway_parameters") String pwd; }
额外修正:SMSCompleteData中的@Transient问题
你在totalCount和lastRunDate上同时用了@Transient和@Column,这会导致Hibernate忽略这两个字段的持久化,因为@Transient标记的字段不会被映射到数据库。需要移除@Transient:
// 移除@Transient @Column(name="MSG_SENT_COUNT", table="last_run_date") Integer totalCount; // 移除@Transient @Column(name="LST_POLL_TIME", table="last_run_date") String lastRunDate;
你的疑问解答
1. 如何向嵌入式表执行插入操作?
不需要单独操作嵌入式表,直接创建/修改SMSCompleteData实例,设置好smsgatewayParams的属性,调用JPA的save()方法保存主实体即可。Hibernate会自动将嵌入式类的字段插入到对应的sms_gateway_parameters表中,因为该表是主表的secondary table,与主表共享主键push_cd。
示例代码:
SMSCompleteData data = new SMSCompleteData(); data.setPushCode(1); // 设置其他主表字段... SmsGateway gatewayParams = new SmsGateway(); gatewayParams.setPushCode(1); // 与主实体主键一致 gatewayParams.setCtype(2); gatewayParams.setDcode("TEST"); // 设置其他网关参数... data.setSmsgatewayParams(gatewayParams); smsCompleteDataRepository.save(data);
2. 嵌入式类属于非实体类,能否通过主表对其关联的嵌入式表进行插入/更新?
可以。嵌入式类(@Embeddable)是主实体的组成部分,没有独立的生命周期,所有对嵌入式类的操作都必须通过主实体完成。当你保存或更新主实体时,Hibernate会自动同步嵌入式类的字段到对应的关联表(这里是sms_gateway_parameters)。
3. 若要操作sms_gateway_parameters表,是否必须单独创建实体类?
不需要。当前你已经通过@SecondaryTable+@Embeddable的方式将该表与主实体关联,完全可以通过SMSCompleteData实体来操作sms_gateway_parameters的所有数据。
只有当你需要不依赖主表单独操作sms_gateway_parameters(比如单独查询、删除该表的数据,不需要关联主表字段)时,才需要为该表创建独立的实体类。
内容的提问来源于stack exchange,提问作者Shiladitya Thakur
相关产品推荐
相关产品推荐

