2014-02-17 2 views
0

영속 객체 업데이트에 문제가 있습니다. 내가 입학을 생성하고 저장하면스프링 데이터 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; 

는, 모두가 잘 : 나는 두 개체 "입학"와 "위치"다음과 같이 있습니다. 그러면 내가 Admission Update를 가져 오면 새로운 Location 객체로 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

관련 문제