繁体   English   中英

使用休眠一对一映射时未插入外键

[英]foreign key not getting inserted when hibernate one to one mapping is used

我有两个实体如下

用户实体

@Entity
@Table(name = "user")
@Getter
@Setter
public class UserEntity{

    @Id
    @GeneratedValue(strategy = GeneratedType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    @Column(name = "user_name")
    private String name;

    @OneToOne(Cascade=CascadeType.ALL, mappedBy="user")
    private UserAddressEntity addressEntity;
}

用户地址实体

@Entity
@Table(name = "user_address")
@Getter
@Setter
public class UserAddressEntity{
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_id")
    private Long userId;

    @Column(name = "address")
    private String address;

    @OneToOne
    @JoinColumn(name = "user_id", nullable = false, referencedColumnName = "user_id")
    private UserEntity user;
}

我在服务类中保存用户实体如下

@Service
public class UserService{

    @Autowired
    private UserRepository userRepository;

    public void saveUser(){
        UserEntity userEntity=new UserEntity();
        UserAddressEntity userAddressEntity=new UserAddressEntity();

        //logic here

        userEntity.setAddressEntity(userAddressEntity);
        userRepository.save(userEntity);
    }
}

保存实体user_id列后不会保存在user_address表中。 它的值被保存为空值。我似乎无法找到问题所在。

编辑:我在评论中提到的答案之后添加了以下实体,但我收到此错误

Infinite recursion (StackOverflowError)

@Entity
@Table(name = "user")
@Getter
@Setter
public class UserEntity{

    @Id
    @GeneratedValue(strategy = GeneratedType.IDENTITY)
    @Column(name = "user_id")
    private Long userId;

    @Column(name = "user_name")
    private String name;

    @OneToOne(Cascade=CascadeType.ALL, mappedBy="user")
    private UserAddressEntity addressEntity; 

    //added this
    public void setAddressEntity(UserAddressEntity addressEntity){
        if (!addressEntity.equals(this.addressEntity)){
            this.addressEntity=addressEntity;
            addressEntity.setUser(this);
        }

    }
@Entity
@Table(name = "user_address")
@Getter
@Setter
public class UserAddressEntity{
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_id")
    private Long userId;

    @Column(name = "address")
    private String address;

    @OneToOne
    @JoinColumn(name = "user_id", nullable = false, referencedColumnName = "user_id")
    private UserEntity user;

    //added this
    public void setUser(UserEntity user){
        if (!user.equals(this.user){
            this.user=user;
        }
    }
}

您需要在UserService.saveUser()正确设置关系:

 userEntity.setAddressEntity(userAddressEntity);
 userAddressEntity.setUser(userEntity);

此外,使用常规的 getter/setter,无需在那里添加逻辑。

映射@OneToOne 的推荐/最佳方法是使用@MapsId。 使用这种方法,您根本不需要双向关联。

我建议您查看下面的链接,在那里您可以通过示例如何在对象之间保存和映射来回答您的问题。

https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM