Embedded Id设置为null

时间:2014-12-02 08:42:53

标签: java jpa

我有以下实体:

@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实体时,messageId的{​​{1}}未被设置 并将null发送到数据库。

2 个答案:

答案 0 :(得分:0)

问题在于,您的嵌入式ID是两个字段messageIdaccountabilityId的组合,但在您的代码中,您只需为accountabilityId设置一个值:

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

您缺少设置messageId,这就是null的{​​{1}}值的原因,因为您需要设置两个字段值,以便它们不会messageId,您只需要设置null

messageId

修改

将您的messageReceiverId.setMessageId(message.getId());/* the id value here */ 对象保存在数据库中,然后将其分配给message,然后将此行:

messageReceiver

应该在这之前:

messageManager.saveMessage(message);

然后最后,将messageReceiver.setMessage(message); 对象保存在数据库中。

答案 1 :(得分:0)

我找到了一个解决方案如下:

对于message实体的MessageReceiver属性,我应该添加@MapsId,如:

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