2014-02-17 4 views
0

У меня проблема с обновлением постоянных объектов. У меня есть два объекта «Прием» и «Адрес» выглядит следующим образом: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; 
    } 
} 

ответ

2

Кажется, что

public void transfer(MSH msh, PV1 pv1, PV2 pv2) { 

не выполняется в рамках транзакции, пожалуйста, добавьте @Transactional к классу обслуживания.

+0

Благодарим вас за это. Вы только что решили кучу вопросов одним выстрелом! Таким образом, любой метод, который обновляет объекты данных, должен быть установлен как @Transactional - это правильно? – skyman

+0

, это правильно, мой друг, когда транзакция завершения метода совершена, но у вас должна быть открытая действительная транзакция для обновления данных. Если вы ищете только транзакцию, не требуется – Koitoer

Смежные вопросы