我有以下实体:
@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
保存级联不会传播,我必须先保存Total_fee AS (DATEDIFF(DAY, Date_of_Rent_End_Due, Date_of_Rent_End)) * @fee_per_day
,然后再将其设置为用户。我错过了什么,我应该检讨一下我的关联吗?
感谢
答案 0 :(得分:2)
您在关系的错误一侧指定mappedBy。它应该在反向(非拥有)方面指定。由于您希望用户保存帐户,因此用户必须是所有者。
答案 1 :(得分:1)
您的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;
//...
}
请参阅类似示例here.
答案 2 :(得分:0)
要完成此帖子,从子级到父级的级联操作在这种情况下@OneToOne(optional=false,mappedBy=...)
起作用。如果我们在子级中设置optional=false
,则级联似乎有效(至少Cascade.PERSIST
)。