外键正在更新为空

我正在尝试使用 @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。如果理解不正确请指正。


白猪掌柜的
浏览 96回答 1
1回答

慕哥6287543

尽管Cascade.PERSIST确保CardInfo对象与其父对象一起持久存在User,但维护关系是应用程序或对象模型的责任[ 1 ]。由于外键位于 中CardInfo,因此您必须确保每个都CardInfo与您要保留的 相关联User。一种常见的模式是添加额外的逻辑来处理域对象中关系的双方,例如:public class User {&nbsp; &nbsp; // fields, accessors and mutators&nbsp; &nbsp; public void addPaymentDetails(CardInfo cardInfo) {&nbsp; &nbsp; &nbsp; &nbsp; if (paymentDetails == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; paymentDetails = new LinkedHashSet<>();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (cardInfo.getUser() != this) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cardInfo.setUser(this);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; paymentDetails.add(cardInfo);&nbsp; &nbsp; }}上面的代码确保关系的双方同步(即,如果用户将卡添加到其付款详细信息中,则该卡信息由用户“拥有”)。CardInfo最后,虽然与您的问题没有直接关系,但我的建议是在和 之间建立强制关系User及其各自的连接列,NOT NULL以便查询得到正确优化,并且CardInfo数据库中不能存在与其所属的关联User:@ManyToOne(fetch = FetchType.LAZY, optional = false)@JoinColumn(name="user_id", nullable = false)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java