2014-12-02 119 views
0

我有以下實體:嵌入式ID設置爲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", [email protected](name="MessageID", nullable=false, length=36, columnDefinition = "uniqueIdentifier")), 
      @AttributeOverride(name="accountabilityId", [email protected](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實體時,messageIdMessageReceiverId未被設置爲 並向數據庫發送空值。

回答

0

我找到了解決方法如下:

對於我應該補充@MapsIdMessageReceiver實體的財產message

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

的問題是,你的嵌入式編號是兩個領域,messageIdaccountabilityId,但在你的代碼中只設置一個值accountabilityId的組合:

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

你缺少設置messageId,這就是爲什麼你會爲messageId一個null價值,因爲你需要設置兩個字段值,所以他們不會null,你只需要設置一個messageId太:

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

編輯:

在數據庫中它和它的ID分配給messageReceiver之前,保存message對象,那麼這行:

messageManager.saveMessage(message); 

對子級是這樣一個前:

messageReceiver.setMessage(message); 

然後最後在數據庫中保存messageReceiver對象。

+0

的問題是,'message'是一個新創建的實體並且尚未保留,所以它沒有爲它自動創建任何消息ID。請注意,messageId應自動創建併合併到其他相關實體中。 – Soosh 2014-12-02 10:53:00

+0

因此,在將其ID分配給'messageReceiverId'之前,必須將該消息對象保存在數據庫中。 – 2014-12-02 12:01:42

+0

是的,因爲'messageId'是我自動生成的。 – Soosh 2014-12-02 12:08:11