You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从含关联表的主表操作嵌入式表报错及相关技术问询

问题解决与疑问解答

先解决当前报错

报错原因是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:02:07