java - 外键正在更新为空

标签 java hibernate

我正在尝试使用 @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);
    }

}

上述代码确保关系双方同步(即,如果用户将卡添加到其付款详细信息中,则卡信息由用户“拥有”)。

最后,虽然与您的问题没有直接关系,但我的建议是使 CardInfoUser 之间的关系成为强制性的,及其各自的联接列 NOT NULL 以便正确优化查询,并且数据库中不能存在 CardInfo,而无需与其所属的 User 关联:

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name="user_id", nullable = false)

关于java - 外键正在更新为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58326057/

相关文章:

java - 简单的 Hibernate 映射建议

java - 使用 Observable.timeout 超时后会发生什么?

java - 如何检查一个单词是否可以由一组字母拼写

java - 具有多行的 JTable : any reusable solutions out there?

java - 使用 for 循环在 hibernate 中保存多条记录

java - 使用域对象来获取数据

hibernate - Spring 3 MVC hibernate 错误

java - 使用 modifyHandshake 在 WebSocket 握手中添加 header

java - 动态创建新的滚动文件 LOG4j2 2.6

java - 当我们使用 hibernate 创建主键时,我们使用 @Id 作为注释,但是应该使用什么注释来定义外键