JPA实体复合主键无法保存至数据库问题求助
JPA使用@EmbeddedId时save无插入记录的原因分析
- 复合主键已存在:JPA的
save()方法会先判断实体是否为新——也就是看嵌入式主键的字段组合在数据库里有没有匹配记录。如果你的MyEntityId字段值和已有记录完全重复,save()就会执行更新而非插入,此时只会触发检查主键的查询,不会有插入语句。 equals()和hashCode()方法实现错误:嵌入式主键类MyEntityId必须正确重写这两个方法,JPA靠它们判断实体是不是新的。要是只比较了部分主键字段,或者用了默认的对象引用比较,JPA可能误判实体已存在,直接跳过插入。- 事务未提交:Service层调用
save()时,如果没开事务或者事务没正确提交,数据只会停留在持久化上下文里,不会同步到数据库。这种情况下save()不会报错,但数据库里看不到新记录。 - 实体状态异常:如果实体之前被
find()方法加载过,之后修改了主键再调用save(),JPA会认为这是已存在的实体,执行更新而非插入。或者实体被错误设置为detached状态,也会导致插入逻辑不触发。 - 主键字段未赋值:
MyEntityId里的任意一个主键字段如果是null(而数据库主键字段不允许null),JPA可能无法生成有效插入语句,或者判定实体无效,直接跳过插入操作。要确保所有复合主键字段都有非null值。
内容的提问来源于stack exchange,提问作者Hayk Mkhitaryan
相关产品推荐
相关产品推荐

