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

关于JHipster中JDL配置@MapsId注解未生效的技术问询

JDL中@MapsId与内置User实体一对一关联不生效的解决办法

我们为扩展JHipster内置的User实体,创建了AppUser实体并通过JDL配置一对一关联,同时加上了@MapsId和@OnDelete注解,期望AppUser复用User的ID作为自身主键:

relationship OneToOne {
    AppUser{user(login)} to @OnDelete("CASCADE") @MapsId User with builtInEntity
}

但生成的代码未达预期,AppUser的ID字段依然带有@GeneratedValue和@SequenceGenerator注解,@MapsId没起到复用User ID的作用:

@Entity
@Table(name = "app_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@SuppressWarnings("common-java:DuplicatedBlocks")
public class AppUser implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id")
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(unique = true)
    private User user;
    // ...其他代码
}

这是因为JHipster对内置实体(builtInEntity)的关联处理存在特殊逻辑,默认没有正确解析@MapsId在该场景下的配置,导致生成代码时沿用了普通实体的自增ID策略。

解决办法:手动调整实体代码

直接修改生成的AppUser实体,调整ID字段和关联注解,让@MapsId生效:

@Entity
@Table(name = "app_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@SuppressWarnings("common-java:DuplicatedBlocks")
public class AppUser implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Long id; // 移除自增相关注解

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId // 标记复用关联实体的ID
    @JoinColumn(name = "id") // 指定关联列为主键列
    @OnDelete(action = OnDeleteAction.CASCADE)
    private User user;

    // 其他字段、getter/setter等保持不变
}

修改后,AppUser的ID会完全依赖关联的User实体ID,创建AppUser时无需单独生成主键,直接通过关联的User同步ID,同时级联删除逻辑也能正常触发。

内容的提问来源于stack exchange,提问作者vic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:27:04