简体   繁体   English

嵌入式ID设置为null

[英]Embedded Id is set to null

I have the following entities: 我有以下实体:

@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;
}

AND

@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;
}

AND

@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;

}    

And I use them in the following code 我在以下代码中使用它们

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);

But when I want to merge the Message entity, the messageId of MessageReceiverId is not being set and sending null to the database. 但是,当我想合并Message实体时,未设置MessageReceiverIdmessageId并将其发送给数据库。

The problem is that your embedded Id is a combination of two fields, messageId and accountabilityId but in your code you are only setting a value to the accountabilityId : 问题是您的嵌入式ID是两个字段的组合,即messageIdaccountabilityId但是在您的代码中,您仅将一个值设置为accountabilityId

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

You are missing to set the messageId , that's why you will have a null value for the messageId , because you need to set the two fields values so they won't be null , you just need to set a messageId too: 这是因为丢失设置messageId ,这就是为什么你将有一个null的值messageId ,因为你需要设置两个字段值,所以他们不会是null ,你只需要设置一个messageId太:

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

Edit: 编辑:

Save your message object in the database before assigning it and its id to the messageReceiver , then this line : 在将message对象及其ID分配给messageReceiver之前,将message对象保存在数据库中,然后此行:

messageManager.saveMessage(message);

Whould be before this one: 谁可能在此之前:

messageReceiver.setMessage(message);

Then in the end, save the messageReceiver object in the database. 然后最后,将messageReceiver对象保存在数据库中。

I found a solution as follows: 我找到了以下解决方案:

For the message property of the MessageReceiver entity I should have added @MapsId like: 对于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