[英]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
实体时,未设置MessageReceiverId
的messageId
并将其发送给数据库。
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是两个字段的组合,即
messageId
和accountabilityId
但是在您的代码中,您仅将一个值设置为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.