首页 > 解决方案 > Hibernate 一对一映射外键 null

问题描述

在这里,我有两个不同的表,用户和个人资料图像。两者都使用一对一关系进行映射。问题是 - 将新的个人资料图像插入数据库时​​,个人资料图像的外键 (user_userid) 为空。为什么 user_id 仍然为空......我多次提出这个问题......我映射两个实体的方式有什么问题吗?......

用户

@Entity
@Getter
@Setter
@Table(name = "Users")
public class User {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToOne(cascade = CascadeType.ALL,mappedBy = "user",fetch =FetchType.LAZY)
    private UserProfileImage userProfileImage;
}

个人资料图片

@Entity
@Getter
@Setter
public class UserProfileImage {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "type")
    private String type;
    @Column(name = "picByte", length = 1000000)
    private byte[] picByte;

    @OneToOne(fetch =FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    public UserProfileImage() {
        super();
    }

    public UserProfileImage(String name, String type, byte[] picByte) {
        this.name = name;
        this.type = type;
        this.picByte = picByte;
    }
}

控制器

public ResponseEntity<String> addProfileImage(int id,MultipartFile file) {
        User user=userRepository.findById(id);
        UserProfileImage present=user.getUserProfileImage();
        if(present==null) {
            UserProfileImage userProfileImage = new UserProfileImage(file.getOriginalFilename(), file.getContentType(), file.getBytes());
            user.setUserProfileImage(userProfileImage);
        }else{
            present.setName(file.getOriginalFilename());
            present.setType(file.getContentType());
            present.setPicByte(file.getBytes());
            user.setUserProfileImage(present);
        }
        userRepository.save(user);
       
    }

标签: javaspring-boothibernate

解决方案


正如休眠文档中所述:

每当形成双向关联时,应用程序开发人员必须确保双方始终保持同步。

因此,您应该addProfileImage以这种方式更正您的方法:

public ResponseEntity<String> addProfileImage(int id,MultipartFile file) {
  User user=userRepository.findById(id);
  UserProfileImage present=user.getUserProfileImage();
  if(present==null) {
     UserProfileImage userProfileImage = new UserProfileImage(file.getOriginalFilename(), file.getContentType(), file.getBytes());

     // sync both sides of bidirectional association
     user.setUserProfileImage(userProfileImage);
     userProfileImage.setUser(user);
  } else {
      present.setName(file.getOriginalFilename());
      present.setType(file.getContentType());
      present.setPicByte(file.getBytes());

      // this is redundant
      // user.setUserProfileImage(present);
  }
  userRepository.save(user);
}

推荐阅读