2014-02-17 30 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