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



>我有两个条目如下

用户实体

@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/

最新更新