关于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
相关产品推荐
相关产品推荐

