Spring 5 Data Jpa - OneToOne,新实体,单个插入操作

jobtbby3  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(145)

我有一个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属性。

lzfw57am

lzfw57am1#

我终于让它工作了。因为你有两个表,你将需要至少两个插入。另一种选择是嵌入用户详细信息(@Embeddable而不是UserDetails上的@Entity和其他一些更改),但这需要用户表中的列。然后你只有一个表,可以使用单个插入。

public class User {
    ...
    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private UserDetails details;

    public User(String name)
    {
        userDetails = new UserDetails(this);
        this.name = name;
    }
}

字符串
UserDetails:

public class UserDetails {
   @Id
   @Column(name = "user_id")
   private String userId;

   @OneToOne
   @MapsId
   @JoinColumn(name = "user_id")
   private User user;

   public UserDetails(User user)
   {
       this.user = user;
   }
}


现在,如果您创建一个用户,详细信息也会自动创建,并将与用户一起沿着到数据库中。

相关问题