为了账号安全,请及时绑定邮箱和手机立即绑定

外键正在更新为空

外键正在更新为空

白猪掌柜的 2023-10-13 10:06:55
我正在尝试使用 @OneToMany 和 @ManyToOne JPA 注释实现双向关系。我的外键被更新为 NULL,这是不正确的。我需要一些意见来解决这个问题。我创建了 User 和 CardInfo 类。我正在尝试添加一种关系,其中用户可以拥有多张卡。当我尝试保留数据库时,外键被插入为空。@Entity@Table(name = "customer_info")@Data@NoArgsConstructor@AllArgsConstructorpublic 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。如果理解不正确请指正。
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

尽管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)


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信