java - 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);
}
解决方案
正如休眠文档中所述:
每当形成双向关联时,应用程序开发人员必须确保双方始终保持同步。
因此,您应该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);
}
推荐阅读
- cucumber - 如何在 multiple-cucumber-html-reporter 上为功能设置自定义元数据?
- c# - 在 ASP.NET Core 中全局重用变量
- angular - 奇怪的变化检测行为Angular 2+
- html - 在 wordpress 主题的移动导航栏中添加站点名称
- javascript - 如何连接样式
- octobercms - 如何实现 Rainlab 的 User Plus+ 插件的定位功能?
- regex - 将 perl 单行转换为脚本
- php - 关于替换 URL 中 1 个字符的更优雅解决方案的建议
- amazon-cloudformation - Sub 和 Join 逗号分隔列表
- npm - Gulp SASS 不编译 @import 更改