[英]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.