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.
我有 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.