2014-02-17 28 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將Location更新爲新的Location對象,則Admission不保存/更新。我使用保存的代碼是:

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