我有一个table User实体/table,id作为主键/ string / uuid生成的值。我还有一个UserDetails实体/table,userId作为主键/ string / foreign key到user. id。注意,在UserDetails java实体中我不需要User实体,但user_id就足够了。
我尝试以这样的方式定义实体,即插入新的User实体也将创建一个新的UserDetails行,具有相同的id。
有什么想法可以实现吗?
为了澄清,我想要的可以通过这样做在SQL中实现:
BEGIN
INSERT INTO user (id, name) VALUES ('auto-generated-uuid-31212', 'Bobby');
INSERT INTO user_details (user_id) VALUES ('auto-generated-uuid-31212');
COMMIT
字符串
我的最后一次尝试是在UserDetails上有2列- String userId和@Id(没有其他Map),User user和OneToOne/JoinColumn(name=“userId”)/MapsId注解。
然而,似乎spring/hibernate试图先保存UserDetails信息,而不是与User一起保存,我最终得到了外键约束失败的外键约束。
快速验证码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Entity
public class User {
@Id
@Column
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Column
private String name;
@JoinColumn(name = "id")
@OneToOne(cascade = CascadeType.ALL)
@NotNull
@Builder.Default
private UserDetails userDetails = new UserDetails();
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Entity
public class UserDetails {
@Id
private String userId;
@OneToOne
@JoinColumn(name = "userId")
@MapsId
private User user;
}
的数据
编辑:我忘了在这个问题中添加User的UserDetails属性。
1条答案
按热度按时间lzfw57am1#
我终于让它工作了。因为你有两个表,你将需要至少两个插入。另一种选择是嵌入用户详细信息(@Embeddable而不是UserDetails上的@Entity和其他一些更改),但这需要用户表中的列。然后你只有一个表,可以使用单个插入。
字符串
UserDetails:
型
现在,如果您创建一个用户,详细信息也会自动创建,并将与用户一起沿着到数据库中。