簡體   English   中英

嵌入式ID設置為null

[英]Embedded Id is set to null

我有以下實體:

@Entity
@Table(name = "B_Message")
public class Message implements java.io.Serializable {
    @Id
    @GeneratedValue(generator = "app-uuid")
    @Column(name = "MessageID", unique = true, nullable = false, length = 36, columnDefinition = "uniqueIdentifier")
    private String id;

    @OneToMany(cascade= {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY, mappedBy = "message")
    private Set<MessageReceiver> messageReceivers;
}

@Entity
@Table(name="B_MessageReceiver")
public class MessageReceiver implements java.io.Serializable {

    @EmbeddedId
    @AttributeOverrides( {
            @AttributeOverride(name="messageId", column=@Column(name="MessageID", nullable=false, length=36, columnDefinition = "uniqueIdentifier") ),
            @AttributeOverride(name="accountabilityId", column=@Column(name="AccID", nullable=false, length=36, columnDefinition = "uniqueIdentifier") ) } )
    private MessageReceiverId id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="MessageID", nullable=false, insertable=false, updatable=false)
    private Message message;
}

@Embeddable
public class MessageReceiverId implements java.io.Serializable {


    @Column(name = "MessageID", nullable = false, length = 36)
    private String messageId;


    @Column(name = "AccID", nullable = false, length = 36)
    private String accountabilityId;

}    

我在以下代碼中使用它們

Message message = new Message();

Set<MessageReceiver> messageReceivers = new HashSet<MessageReceiver>();

MessageReceiver messageReceiver = new MessageReceiver();
MessageReceiverId messageReceiverId = new MessageReceiverId();
messageReceiverId.setAccountabilityId(this.accountabilityModel.getId());
messageReceiver.setMessage(message);
messageReceiver.setId(messageReceiverId);
messageReceivers.add(messageReceiver);

messageManager.saveMessage(message);

但是,當我想合並Message實體時,未設置MessageReceiverIdmessageId並將其發送給數據庫。

問題是您的嵌入式ID是兩個字段的組合,即messageIdaccountabilityId但是在您的代碼中,您僅將一個值設置為accountabilityId

messageReceiverId.setAccountabilityId(this.accountabilityModel.getId());

這是因為丟失設置messageId ,這就是為什么你將有一個null的值messageId ,因為你需要設置兩個字段值,所以他們不會是null ,你只需要設置一個messageId太:

messageReceiverId.setMessageId(message.getId());/* the id value here */

編輯:

在將message對象及其ID分配給messageReceiver之前,將message對象保存在數據庫中,然后此行:

messageManager.saveMessage(message);

誰可能在此之前:

messageReceiver.setMessage(message);

然后最后,將messageReceiver對象保存在數據庫中。

我找到了以下解決方案:

對於MessageReceiver實體的message屬性,我應該添加@MapsId例如:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="MessageID", nullable=false, insertable=false, updatable=false)
@MapsId("messageId")
private Message message;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM