Я пытаюсь сделать мини-проект, в котором есть сценарий, в котором люди могут добавлять информацию о заболеваемости, а другие могут комментировать ее. Но проблема в том, что когда я пытаюсь комментировать инцидент, старый комментарий обновляется новым комментарий вместо создания новой записи. Я использую способ отображения, который имеет столбцы incidenceId и commentId.
Если я добавляю комментарий для incidenceId = 1, он добавляется и отражается в таблице сопоставления, но снова, если я пытаюсь добавить еще один комментарий для того же incidenceId (т.е. 1), он обновляется.
Мой уровень заболеваемости
package com.incture.metrodata.entity;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Entity
@Table(name="INCIDENCE_DETAILS")
@Getter
@Setter
@ToString
public class IncidenceDo implements BaseDo {
private static final long serialVersionUID = 1L;
@Id
@Column(name="INCIDENCE_ID")
private String incidenceId;
@Column(name="PRIORITY")
private String priority;
@Column(name="TITLE")
private String title;
@Column(name="BODY")
private String body;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "CREATED_AT")
private Date createdAt;
@Column(name="CREATED_BY")
private String createdBy;
@Column(name="TRIP_ID")
private String tripId;
@Column(name="SHIPMENT_ID")
private Long shipmentId;
@Column(name="RECIPIENT")
private String recipient;
@Column(name="LATITUDE")
private Double latitude;
@Column(name="LOGITUDE")
private Double logitude;
@Column(name="ADDRESS")
private String address;
@Column(name="DELETED")
private Integer deleted=0;
@OneToMany(targetEntity = CommentsDo.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name="INCIDENCE_COMMENTS",joinColumns={ @JoinColumn(name="INCIDENCE_ID") },inverseJoinColumns = {
@JoinColumn(name = "COMMENT_ID") })
private List<CommentsDo> comments=new ArrayList<CommentsDo>();
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "INCIDENCE_USERS", joinColumns = { @JoinColumn(name = "INCIDENCE_ID") }, inverseJoinColumns = {
@JoinColumn(name = "USER_ID") })
private Set<UserDetailsDo> users=new HashSet<UserDetailsDo>(0);
public void setDeleted() {
this.deleted=1;
}
@Override
public Object getPrimaryKey() {
// TODO Auto-generated method stub
return incidenceId;
}
}
Мой комментарий:
package com.incture.metrodata.entity;
import java.util.Date;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
enter code here
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Entity
@Table(name="COMMENTS")
@Getter
@Setter
@ToString
public class CommentsDo implements BaseDo{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@Column(name = "COMMENT_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long commentId;
@Lob
private String comment;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "CREATED_AT")
private Date createdAt;
@Column(name = "CREATED_BY")
private String createdBy;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "UPDATED_AT")
private Date updatedAt;
@Column(name = "IS_DELETED")
private int isDeleted=0;
@Override
public Object getPrimaryKey() {
return commentId;
}
}
Способ сохранения комментария
// Create
public D create(D dto,E dos) throws Exception {
// persisting the dto
E e = importDto(dto,dos);
persist(e);
getSession().flush();
getSession().clear();
return exportDto(e);
}
Метод impordto () равен
IncidenceDo importDto(IncidenceDTO dto, IncidenceDo dos) throws Exception {
if (ServicesUtil.isEmpty(dos))
dos = new IncidenceDo();
if (!ServicesUtil.isEmpty(dto)) {
if (!ServicesUtil.isEmpty(dto.getIncidenceId()))
dos.setIncidenceId(dto.getIncidenceId());
if (!ServicesUtil.isEmpty(dto.getPriority()))
dos.setPriority(dto.getPriority());
if (!ServicesUtil.isEmpty(dto.getBody()))
dos.setBody(dto.getBody());
if (!ServicesUtil.isEmpty(dto.getTitle()))
dos.setTitle(dto.getTitle());
if (!ServicesUtil.isEmpty(dto.getCreatedAt()))
dos.setCreatedAt(dto.getCreatedAt());
if (!ServicesUtil.isEmpty(dto.getTripId()))
dos.setTripId(dto.getTripId());
if (!ServicesUtil.isEmpty(dto.getShipmentId()))
dos.setShipmentId(dto.getShipmentId());
if (!ServicesUtil.isEmpty(dto.getRecipient()))
dos.setRecipient(dto.getRecipient());
if (!ServicesUtil.isEmpty(dto.getLatitude()))
dos.setLatitude(dto.getLatitude());
if (!ServicesUtil.isEmpty(dto.getLogitude()))
dos.setLogitude(dto.getLogitude());
if (!ServicesUtil.isEmpty(dto.getDeleted()))
dos.setDeleted(dto.getDeleted());
if (!ServicesUtil.isEmpty(dto.getCreatedBy()) && dto.getCreatedBy() instanceof String) {
dos.setCreatedBy(dto.getCreatedBy().toString());
}
// parsing comments
if (!ServicesUtil.isEmpty(dto.getComments())) {
List<CommentsDo> comments = commentDao.importList(dto.getComments(), dos.getComments());
dos.setComments(comments);
}
importList
public List<E> importList(List<D> dList,List<E> eList) throws Exception {
List<E> list = new ArrayList<E>();
for (D d : dList) {
E dos = null;
try {
dos = getByKeysForFK(d);
for(E e : eList){
if( d.getPrimaryKey().equals(e.getPrimaryKey())){
dos = e;
break;
}
}
} catch (Exception e) {
}
list.add(importDto(d,dos));
}
return list;
}