Hibernate 创建条目但不在@OneToOne 中设置 FK

Hibernate creating entry but not setting FK in @OneToOne

我有 2 个实体,它们通过 @OneToOne 注释连接。首先是我的 类 以便更好地理解:

第二个实体:

@Table(name = "REASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSAL")
@Entity
public class ReversalReason implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 3338809410372872259L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer code;

    private boolean tax;
    private boolean currency;
    private boolean amountChange;
    private boolean locationChange;
    private boolean recipient;
    private boolean period;

    public ReversalReason() {

    }
}

基础实体:

@Table(name = "CLIENT_CHEQUE_PAYMENT")
@Entity
public class ClientChequePayment extends BaseDomainObject implements Serializable {
    /** Serial version UID */
    private static final long serialVersionUID = -1988633355L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer code;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "code", nullable = true)
    private ReversalReason reasonForReversal;

    @Column(nullable = true, length = 50)
    private String proposeReversalUser;
    @Column(length = 50, unique = true)
    private String displayCode;
    @Column(length = 50)
    private String originalEntry;

    private PaymentStatus originalPaymentStatus;

我确实省略了一些字段,否则代码会太多。现在让我们进入问题:

在我的程序中,我希望能够通过调用 session.update(clientChequePayment); 来设置 ClientChequePayment 的字段 reasonForReversal。我在调用 update 之前检查了该字段是否已设置,确实如此。问题是,hibernate 确实为 ReversalReason 创建了一个条目,但它没有将 ReversalReason 的 PK 设置为 ClientChequePayment 条目中的 FK。因此,我可以为 1 ClientChequePayment 创建多个 ReversalReason 条目。

我的映射是否正确(我不需要通过 ReversalReason 访问 ClientChequePayment,反之亦然)?即使不需要,映射也应该是双向的吗?

继续评论。

这就是问题所在,您需要一个具有指向 REASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSAL 的外键的列。

意思是,你的 table CLIENT_CHEQUE_PAYMENT 需要一个指向 REASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSAL 的外键,比如 id_reversal_reason 然后你可以这样做:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id_reversal_reason", nullable = true)
private ReversalReason reasonForReversal;

连接列位于源 table 的所有者 table 上。

来自 @JoinColumn javadocs 的 name 的片段:

(Optional) The name of the foreign key column.
 * The table in which it is found depends upon the
 * context.
 * <ul>
 * <li>If the join is for a OneToOne or ManyToOne
 *  mapping using a foreign key mapping strategy,
 * the foreign key column is in the table of the
 * source entity or embeddable.