У меня проблема с обновлением постоянных объектов. У меня есть два объекта «Прием» и «Адрес» выглядит следующим образом:Spring Data JPA постоянный объект не обновляется
@Entity
@Table(name = "Admissions")
public class Admission implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(optional=false)
@JoinColumn(name="DemographicId", unique = true, nullable=false)
private Demographic demographic;
@OneToOne(optional=false)
@JoinColumn(name="VisitId", unique = true, nullable=false)
private Visit visit;
@OneToOne(optional=false)
@JoinColumn(name="LocationId", nullable=false)
private Location location;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "Updated", unique = false, nullable = false)
private Date updated;
@Entity
@Table(name = "Locations")
public class Location implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@JoinColumn(name="FacilityId", nullable=true)
private Facility facility;
@JoinColumn(name="WardId", nullable=true)
private Ward ward;
@JoinColumn(name="RoomId", nullable=true)
private Room room;
@JoinColumn(name="BedId", nullable=true)
private Bed bed;
Если я создаю Прием и сохранить его, все хорошо. Если я затем вернусь к обновлению входа в систему для местоположения на новый объект Location, вход не сохранит/не обновит. Код, я использую, чтобы сохранить это:
public void transfer(MSH msh, PV1 pv1, PV2 pv2) {
String visitNumber = pv1.getVisitNumber().getIDNumber().getValue();
Visit myVisit = visitService.findByVisitNumber(visitNumber);
if (myVisit == null) {
log.debug("Unable to transfer if we have no Visit");
return;
}
Admission myAdmission = admissionService.findByVisit(myVisit);
myAdmission.setLocation(getLocation(msh, pv1));
}
Я попытался сделать окончательный сохранить и вровень (который, кажется, не работает), но понимаю, что это не должно быть необходимым.
Пример моего класса обслуживания
@Service
public class LocationServiceImpl implements LocationService {
@Resource
private LocationRepository repository;
@Transactional
public Location create(Location location) {
Location created = location;
return unique(created);
}
@Transactional
public Location findByLocation(Location location) {
return repository.findByLocation(location.getFacility(),
location.getWard(), location.getRoom(), location.getBed());
}
@Transactional
private Location unique(Location location) {
Location found = findByLocation(location);
if (found == null) {
return repository.save(location);
}
return found;
}
}
Благодарим вас за это. Вы только что решили кучу вопросов одним выстрелом! Таким образом, любой метод, который обновляет объекты данных, должен быть установлен как @Transactional - это правильно? – skyman
, это правильно, мой друг, когда транзакция завершения метода совершена, но у вас должна быть открытая действительная транзакция для обновления данных. Если вы ищете только транзакцию, не требуется – Koitoer