Вот соответствующие части кода, который я унаследовал.Объект «процесс» - это старый процесс, который передается методу.Объект «newProcess» - это то, чем я заменяю его, используя различные поля по выбору пользователя.
try
{
final EntityManager em = getEntityManager();
em.getTransaction().begin();
JpaProcessDAO pDao = new JpaProcessDAO(em);
Process newProcess = pDao.findById(processId);
newProcess.setName(process.getName());
newProcess.setDataBaseVersion(process.getDataBaseVersion());
newProcess.setNotes(process.getNotes());
newProcess.setReadyForUse(process.getReadyForUse();
newProcess.setSteps(process.getSteps());
em.merge(newProcess); <---- WHERE PROBLEM OCCURS
em.persist(newProcess);
em.getTrasaction().commit();
}
RESULT : каждое поле, которое я изменяю, изменяется в newProcess EXCEPT "Шаги».Во время шага слияния в коде этот список возвращается к шагам, которые были в исходном объекте «process».
Теперь это может быть потому, что «Step» сам объект, а не примитив, как всеиз других полей, которые я установил в "newProcess":
Отображение в Process.java
@OneToMany(mappedBy="process")
private List<Step>
// getter, setter
В Step.java есть коллекция объектов, некоторые изкоторые представляют собой списки самих непримитивных объектов.
Step.java
public class Step implements Serializable {
@Id
@Column(name = "step_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int stepId;
private String duration;
private String name;
private String notes;
private Integer sort;
@OneToMany(mappedBy="step", cascade=CascadeType.REMOVE)
private List<Constituent> constituents;
@OneToMany(mappedBy="step")
private List<Reference> references;
@ManyToOne
@JoinColumn(name ="process_id")
private Process process;
@OneToMany(mappedBy="step",cascade=CascadeType.REMOVE)
private List<StepEquipment> stepEquipments;
public Step() {
}
// getters/setters
}
Кто-нибудь знает, что этот унаследованный код, который я мог, мог сделать неправильно?
ДОПОЛНЕНИЯ К КОДУ 11/29:
public T findById(final Integer id) throws CPDPersistenceExceptin {
return findByPrimaryKey(id,templateClass);
}
public T findBYPrimaryKey(Object key, Class<T> clazz) {
T t = getEntityManager().find(clazz,key);
getEntityManager.merge(t);
getEntityManager.refresh(t);
return t; <-------------- newProcess is returned by this statement.
}
newProcess не содержит шагов, которые были в исходном процессе, и не имеет ProcessCategories, которые были в процессе.Журналы Hibernate сообщают, что select выполняется для process_id, database_version, process_name, process_notes и process_ready_to_use только в операторах слияния и обновления.