Halo semua,
saya mau bertanya ttg relasi many-to-many di hibernate.
sy punya relasi sbb, dmn di table SnsTokenMessage memiliki kolom tambahan articleId.
SnsMessage <------- SnsTokenMessage -------> SnsToken
ketika ingin menyimpan SnsTokenMessage, kenapa tidak bisa ya?
konfigurasi yg sy buat ini mengikuti tutorial
disini, dan aneh nya tidak bisa. Apa karena versi hiberate / library?
tidak ada exception / error yg terjadi. Berikut snippet code yg saya punya
SnsMessage snsMessage = snsMessageDao.findById(messageId);
for (SNSMasterDTO dto : listDto) {
if(dto.getState()){
String snsName = dto.getName();
String message = snsMessage.getMessageText();
String articleId = "";
String storedToken = dto.getStoredToken();
SnsToken snsToken = snsTokenDao.findByToken(storedToken);
articleId = .... ambil article ID
SnsTokenMessage snsTokenMessage = new SnsTokenMessage();
snsTokenMessage.setSnsToken(snsToken);
snsTokenMessage.setSnsMessage(snsMessage);
snsTokenMessage.setArticleId(articleId);
snsMessage.getSnsTokenMessages().add(snsTokenMessage);
}
}
snsMessageDao.update(snsMessage); //update snsMessage. Tetapi kenapa SnsTokenMessage tidak di save oleh hibernate?
------------------------------------------------------------------------------------------------------------
@NamedQueries({
@NamedQuery(name = "findSnsMessageByClient", query = "select snsMessage from SnsMessage snsMessage where
snsMessage.content.id = :id")
})
@Entity
@Table(name="SNS_MESSAGE")
public class SnsMessage extends Model {
@OneToMany(mappedBy = "pk.snsMessage", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<SnsTokenMessage> snsTokenMessages = new HashSet<SnsTokenMessage>();
...getter setter
}
------------------------------------------------------------------------------------------------------------
@Entity
@Table(name="SNS_TOKEN")
public class SnsToken extends Model {
@OneToMany(mappedBy = "pk.snsToken", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<SnsTokenMessage> snsTokenMessages = new HashSet<SnsTokenMessage>();
...getter setter
}
------------------------------------------------------------------------------------------------------------
@Entity
@Table(name = "SNS_TOKEN_MESSAGE")
@AssociationOverrides({
@AssociationOverride(name = "pk.snsToken", joinColumns = @JoinColumn(name = "SNS_TOKEN_ID")),
@AssociationOverride(name = "pk.snsMessage", joinColumns = @JoinColumn(name =
"SNS_MESSAGE_ID"))
})
public class SnsTokenMessage {
@EmbeddedId
private SnsTokenMessagePK pk = new SnsTokenMessagePK();
@Column(name = "ARTICLE_ID")
private String articleId;
...getter setter PK & articleID
@SuppressWarnings("unused")
@Column(name="SNS_TOKEN_ID", nullable=false, updatable=false, insertable=false)
private Long snsToken;
@SuppressWarnings("unused")
@Column(name="SNS_MESSAGE_ID",
nullable=false, updatable=false, insertable=false)
private Long snsMessage;
@Transient
public SnsMessage getSnsMessage(){
return getPk().getSnsMessage();
}
public void setSnsMessage(SnsMessage snsMessage){
getPk().setSnsMessage(snsMessage);
}
@Transient
public SnsToken getSnsToken(){
return getPk().getSnsToken();
}
public void setSnsToken(SnsToken snsToken){
getPk().setSnsToken(snsToken);
}
@Embeddable
private static class SnsTokenMessagePK implements
Serializable{
private static final long serialVersionUID = 5780675182250949350L;
@ManyToOne(fetch = FetchType.EAGER)
private SnsToken snsToken;
@ManyToOne(fetch = FetchType.EAGER)
private SnsMessage snsMessage;
...getter setter
}
}