双向@OneToOne级联问题 JPA/Hibernate/Spring-Data



我有下面的实体:

@Entity
public class User implements Serializable {
private String username;
@OneToOne( optional = false, mappedBy = "user", orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL )
private BankAccount bankAccount;
//.....
}

和:

@Entity
public class BankAccount implements Serializable {
@OneToOne( optional = false, fetch = FetchType.LAZY )
@JoinColumn( name = "user", unique = true, referencedColumnName = "username" )
private User user;
//...
}

对我来说,我希望我是对的,User实体是父实体,所以我可以将其操作级联到BankAccount。但是当我尝试这个时:

User user = new User();
user.setBankAccount(new BanckAccount());
userRepository.save(user);

我有这个例外:

org.hibernate.PropertyValueException: not-null property references a null or transient value : org.company.models.User.bankAccount

保存级联不会传播,我必须在将其设置为用户之前保存bankAccount。我是否遗漏了什么,我应该查看我的关联吗? 谢谢

在关系的错误一侧指定 mappedby。它应该在反向(非拥有(端指定。由于您希望用户保存帐户,因此用户必须是所有者。

您的mappedBy应该位于您希望首先保存的子实体中。所以这里的映射应该是在BankAccount.您应该在父实体中使用@JoinColumn,以便子的外键可以存储在父表中。例如:

@Entity
public class User implements Serializable {
private String username;
@OneToOne( optional = false, orphanRemoval = true, fetch = FetchType.LAZY, cascade = CascadeType.ALL )
@JoinColumn(name = "bank_account_id")
private BankAccount bankAccount;
//.....
}

BankAccount

@Entity
public class BankAccount implements Serializable {
@OneToOne( optional = false, fetch = FetchType.LAZY, mappedBy = "bankAccount")
private User user;
//...
}

请参阅此处的类似示例。

为了完成这篇文章,在这种情况下,从子级到父级的级联操作@OneToOne(optional=false,mappedBy=...).如果我们在子端设置optional=false,级联似乎有效(至少Cascade.PERSIST(。

最新更新