我正在尝试使用 @OneToMany 和 @ManyToOne JPA 注释实现双向关系。我的外键被更新为 NULL,这是不正确的。我需要一些意见来解决这个问题。
我已经创建了 User 和 CardInfo 类。我正在尝试添加一种关系,其中用户可以拥有多张卡。当我尝试保留数据库时,外键被插入为空。
@Entity
@Table(name = "customer_info")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
//@GeneratedValue
private String userId;
private String userName;
private Date dateOfBirth;
private boolean primeMember;
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
private Set<CardInfo> paymentDetails;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="card_info")
public class CardInfo implements Serializable {
@Id
private String cardNumber;
@Id
private String cardType; // Debit, Credit
private String cardCategory; // Visa, mastercard
private Date expiryDate;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
@EqualsAndHashCode.Include private User user;
public class DAOImpl {
@Transactional
public String addCustomer(User user) {
// User _user=new User();
// Set<CardInfo> cardData=new HashSet<>();
//
String userId=String.valueOf(Instant.now().toEpochMilli());
user.setUserId(userId);
Session session=sessionFactory.getCurrentSession();
session.persist(user);
return userId;
}
mysql> select * from card_info;
+----------+-------------+--------------+---------------------+---------+
| cardType | cardNumber | cardCategory | expiryDate | user_id |
+----------+-------------+--------------+---------------------+---------+
| CREDIT | 74959454959 | VISA | 2020-04-23 00:00:00 | NULL |
+----------+-------------+--------------+---------------------+---------+
1 row in set (0.00 sec)
user_id 列不应更新为 NULL。如果理解不正确请指正。
最佳答案
尽管 Cascade.PERSIST
确保 CardInfo
对象与其父 User
一起持久存在,但这是应用程序的责任,或者维护关系的对象模型 [ 1 ]。
由于外键位于 CardInfo
中,因此您必须确保每个 CardInfo
都与您要保留的 User
相关联。一种常见的模式是添加额外的逻辑来处理域对象中关系的双方,例如:
public class User {
// fields, accessors and mutators
public void addPaymentDetails(CardInfo cardInfo) {
if (paymentDetails == null) {
paymentDetails = new LinkedHashSet<>();
}
if (cardInfo.getUser() != this) {
cardInfo.setUser(this);
}
paymentDetails.add(cardInfo);
}
}
上述代码确保关系双方同步(即,如果用户将卡添加到其付款详细信息中,则卡信息由用户“拥有”)。
最后,虽然与您的问题没有直接关系,但我的建议是使 CardInfo
和 User
之间的关系成为强制性的,及其各自的联接列 NOT NULL
以便正确优化查询,并且数据库中不能存在 CardInfo
,而无需与其所属的 User
关联:
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name="user_id", nullable = false)
关于java - 外键正在更新为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58326057/