2016-07-13 2 views
0

매우 중첩 된 xml 파일을 구문 분석하여 정보를 저장하는 테이블을 만들었습니다. 따라서 내 데이터베이스의 테이블도 중첩되어 있습니다. 최상위 엔티티는 SpecimenTb입니다.JPA : 할아버지 개체를 업데이트 할 때 손자 개체를 업데이트하는 방법은 무엇입니까?

@Entity 
@Table(name="SPECIMEN_TB") 
public class SpecimenTb implements Serializable { 
    private String mrn; 
    @Column(name="SPECIMEN_NO", unique = true) 
    private String specimenNo; 
    @OneToMany(mappedBy="specimenTb", cascade=CascadeType.ALL) 
    private List<FmReportTb> fmReportTbs; 
} 

SpecimenTb는 FmReportGeneTb

@Entity 
@Table(name="FM_REPORT_TB") 
public class FmReportTb implements Serializable { 
    //bi-directional many-to-one association to SpecimenTb 
    @ManyToOne 
    @JoinColumn(name="SPECIMEN_ID") 
    private SpecimenTb specimenTb; 
    @OneToMany(mappedBy="fmReportTb", cascade=CascadeType.ALL) 
    private List<FmReportGeneTb> fmReportGeneTbs; 
} 

그것은 가능한 파일의 최신 버전이 나중에 올 것이다에 대한 자신의 onetomany 관계가 FmReportTb라는 아이 엔티티를 가지고, 그래서 업데이 트를 구현해야 scheme 내 코드에서. 내가 지킬 때 표본으로 표본 Tb에서 기록을 찾는다. 존재하지 않으면 새 레코드를 삽입하십시오. 그렇지 않으면 동일한 레코드, 아버지, 자녀 및 손자를 업데이트하십시오. DAO를 클래스에서

SpecimenDao specimenDao = new SpecimenDao(em); 
    SpecimenTb specimenTb = specimenDao.findSpecimenBySpecno(blockId); 
    FmReportTb report = null; 
    if (specimenTb != null) { // update 
     report = specimenTb.getFmReportTbs().get(0); 
    } else { // insert 
     report = new FmReportTb(); 
    } 
    if (report.getFmReportGeneTbs() != null) { // update 
     geneList = report.getFmReportGeneTbs(); 
     geneList.clear(); 
    } else { //insert 
     geneList = new ArrayList<FmReportGeneTb>(); 
    } 
    // parse "Genes" section of xml and store in geneList 
    for (Node gene : genes) { 
     FmReportGeneTb geneTb = new FmReportGeneTb(); 
     << set a bunch of stuff for geneTb>> 
     geneTb.setFmReportTb(report); 
    } 
    geneList.add(geneTb); 
    report.setFmReportGeneTb(geneList); 
    if (specimenTb == null) { // insert new record 
     specimenTb = new SpecimenTb(); 
     specimenTb.setSpecimenNo(blockId); 
     specimenTb.setMrn(mrn); 
     report.setSpecimenTb(specimenTb); 
     reports.add(report); 
     specimenTb.setFmReportTbs(reports); 
     specimenDao.persistSpecimen(specimenTb); 
    } else { // update 
     report.setSpecimenTb(specimenTb); 
     reports.add(report); 
     specimenDao.updateSpecimen(specimenTb, mrn, reports); 
    } 

이 지속 다음과 같이 업데이트 방법은 다음과 같습니다 가 //

public void persistSpecimen(SpecimenTb specimen) { 
    EntityTransaction transaction = entityManager.getTransaction(); 
    try { 
     transaction.begin(); 
     entityManager.persist(specimen); 
     transaction.commit(); 
    } catch (Exception e) { 
     transaction.rollback(); 
    } 
} 

가 //

public void updateSpecimen(SpecimenTb specimen, String mrn, List<FmReportTb> reports) { 
    EntityTransaction transaction = entityManager.getTransaction(); 
    try { 
     transaction.begin(); 
     specimen.setSpecimenNo(blockId); 
     specimen.setMrn(mrn); 
     specimen.setFmReportTbs(reports); 
     transaction.commit(); 
    } catch (Exception e) { 
     transaction.rollback(); 
    } 
} 

삽입 내가 원하는 정확히 작동 갱신, 삽입, 그것은 지속 아버지 엔티티 및 모든 엔티티가 cascade=CascadeType.ALL 덕분에 나타납니다. 하지만 업데이트 할 때 SpecimenTb 및 FmReportTb의 이전 레코드를 업데이트하지만 FmReportGeneTb에 새로운 레코드 시리즈를 삽입하는 경향이 있습니다. 그래서 나는 FmReportGeneTb에 새로운 FmReportTb 레코드 세트를 추가하는 것을 끝내었다. (예전의 GeneList와 새로운 버전은 길이가 다를 수있다.) 사실 보이지 않는 FmReportGeneTb의 자식 엔티티와 손자 엔티티가 실제로 있습니다. 관련 테이블을 위에서 아래로 어떻게 업데이트합니까? 난 당신이 FmReportTb에 설정되어 있지만 코드를 볼 않는 다른 어떤 분야 모르는

답변

1

는 첫 번째 줄에 당신이 FmReportTb의 두 개의 레코드에서를 가진 끝난 이유를 설명하는

FmReportTb report = new FmReportTb();

있다 너의 표본. 기존 FmReportTb을 업데이트하려면 ID를 업데이트하기 전에 설정해야합니다.

+0

FmReportTb를 설정하는 수정 방법을 편집했습니다. 이제 삽입하는 대신 FmReportTb를 업데이트하고 있습니다. 그러나 FmReportTb라는 자식 엔티티가 있는데 FmReportGeneTb이라는 업데이트도 필요합니다. 목록이기 때문에 genetb 수준에서는 실제로 업데이트되지 않고 이전 레코드 목록을 삭제하고 새 레코드를 삽입합니다. 내가 정확히 그것을 어떻게합니까? – ddd

+0

최대 절전 모드를 사용하는 경우 추가 [@Cascade ({DELETE_ORPHAN})] (https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/CascadeType.html#DELETE_ORPHAN) fmReportGeneTbs (이 폭포는 최대 절전 모드에서 온 것입니다). – KuroObi

+0

JPA 2.1을 사용하고 있습니다. 'orphanRemoval = true'를 대신 사용해야합니까? – ddd