2014-02-17 4 views
1

일대 다 관계로 doc_table과 code_table 두 개의 테이블이 있습니다. doc_table에서 항목을 삭제하는 서비스를 정의했는데 code_table의 해당 항목을 동시에 삭제해야합니다 (계단식 삭제). 여기에이 서비스를 실행하면, 그것은 Doc_table에서 항목을 삭제하지만,이 Code_table에 삭제 계단식하지 않는 서비스주석을 사용하여 최대 절전 모드에서 계단식 삭제를 허용하는 최대 절전 모드 설정

public void deleteDoctable(String anumber) throws DataBaseAccessException { 
    Session session = null; 
    try { 
    session = HibernateUtils.beginTransaction("emscribedx"); 
    Query q = session.createQuery("delete Doc_table where docnumber = :docnum"); 
    q.setParameter("docnum", anumber); 
    q.executeUpdate(); 
    session.getTransaction().commit(); 
    } catch (HibernateException e_) { 
     e_.printStackTrace(); 
    } 
    finally { 
     try { 
      HibernateUtils.closeSessions(); 
     } catch (Exception e) { 
      NTEVENT_LOG.error("Problem closing hibernate session!!!"); 
     } 
    } 

} 

입니다. 아래는 내가 사용하고있는 Doc_table의 주석이 달린 모델이다. cascadeType.All을 사용하여 일대 다 관계에 주석을 추가합니다. 그러나 나는 여전히 예상되는 캐스케이드 삭제를 얻지 못하고있다.
무슨 일이 벌어지고 있는지에 대한 아이디어가 있으십니까? import java.util.List;

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

import org.hibernate.lucene.Text; 

import com.artificialmed.domain.code.model.Code_table; 
@Entity 
@Table (name="doc_table", catalog="emscribedx") 
public class Doc_table { 
private Long _id; 
private String _acct; 
private String _message; 
private String _document; 
private String _doctype; 
private String _review_date; 
private String _createDate; 
private int _dummyflag; 
private String _reviewer; 
private String _ProcedureDocLast; 
private String _ProcedureDocFirst; 
private String _ProcedureDocMiddle; 
private String _ProcedureDate; 
private String _ProcedureDocNumber; 
private String _Note; 
private String _dbcreate_date; 
private String _docnumber; 
private String _selectedcodes ; 
private int _viewed ; 
private int _postsubmit ; 
private List <Code_table> _code_table; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column (name = "id") 
public Long getId() { 
    return _id; 
} 
public void setId(Long id_) { 
    _id = id_; 
} 

@Column (name = "acct") 
public String getAcct() { 
    return _acct; 
} 
public void setAcct(String acct_) { 
    _acct = acct_; 
} 

@Column (name = "message") 
public String getMessage() { 
    return _message; 
} 
public void setMessage(String message_) { 
    _message = message_; 
} 


@Column (name = "document") 
public String getDocument() { 
    return _document; 
} 
public void setDocument(String document_) { 
    _document = document_; 
} 

@Column (name = "doctype") 
public String getDoctype() { 
    return _doctype; 
} 
public void setDoctype(String doctype_) { 
    _doctype = doctype_; 
} 

@Column (name = "review_date") 
public String getReview_date() { 
    return _review_date; 
} 
public void setReview_date(String reviewDate_) { 
    _review_date = reviewDate_; 
} 

@Column (name = "create_date") 
public String getCreateDate() { 
    return _createDate; 
} 
public void setCreateDate(String createDate_) { 
    _createDate = createDate_; 
} 

@Column (name = "dummyflag") 
public int getDummyflag() { 
    return _dummyflag; 
} 
public void setDummyflag(int dummyflag_) { 
    _dummyflag = dummyflag_; 
} 

@Column (name = "reviewer") 
public String getReviewer() { 
    return _reviewer; 
} 
public void setReviewer(String reviewer_) { 
    _reviewer = reviewer_; 
} 

@Column (name = "ProcedureDocLast") 
public String getProcedureDocLast() { 
    return _ProcedureDocLast; 
} 
public void setProcedureDocLast(String procedureDocLast_) { 
    _ProcedureDocLast = procedureDocLast_; 
} 

@Column (name = "ProcedureDocFirst") 
public String getProcedureDocFirst() { 
    return _ProcedureDocFirst; 
} 
public void setProcedureDocFirst(String procedureDocFirst_) { 
    _ProcedureDocFirst = procedureDocFirst_; 
} 

@Column (name = "ProcedureDocMiddle") 
public String getProcedureDocMiddle() { 
    return _ProcedureDocMiddle; 
} 
public void setProcedureDocMiddle(String procedureDocMiddle_) { 
    _ProcedureDocMiddle = procedureDocMiddle_; 
} 

@Column (name = "ProcedureDate") 
public String getProcedureDate() { 
    return _ProcedureDate; 
} 
public void setProcedureDate(String procedureDate_) { 
    _ProcedureDate = procedureDate_; 
} 

@Column (name = "ProcedureDocNumber") 
public String getProcedureDocNumber() { 
    return _ProcedureDocNumber; 
} 
public void setProcedureDocNumber(String procedureDocNumber_) { 
    _ProcedureDocNumber = procedureDocNumber_; 
} 

@Column (name = "Note") 
public String getNote() { 
    return _Note; 
} 
public void setNote(String note_) { 
    _Note = note_; 
} 

@Column (name = "dbcreate_date") 
public String getDbcreate_date() { 
    return _dbcreate_date; 
} 
public void setDbcreate_date(String dbcreateDate_) { 
    _dbcreate_date = dbcreateDate_; 
} 

@Column (name = "docnumber") 
public String getDocnumber() { 
    return _docnumber; 
} 
public void setDocnumber(String docnumber_) { 
    _docnumber = docnumber_; 
} 


@Column (name = "selectedcodes") 
public String getSelectedcodes() { 
    return _selectedcodes; 
} 
public void setSelectedcodes(String codes_) { 
    _selectedcodes = codes_; 
} 

@Column (name = "viewed") 
public int getViewed() { 
    return _viewed; 
} 
public void setViewed(int viewed_) { 
    _viewed = viewed_; 
} 

@Column (name = "postsubmit") 
public int getPostsubmit() { 
    return _postsubmit; 
} 
public void setPostsubmit(int postsubmit_) { 
    _postsubmit = postsubmit_; 
} 


@OneToMany (mappedBy = "doc_table", targetEntity = Code_table.class, cascade = CascadeType.ALL) 
public List <Code_table> getCode_table() { 
    return _code_table; 
} 
public void setCode_table(List <Code_table> codeTable_) { 
    _code_table = codeTable_; 
} 

답변

0

계단식은 해당 세션에서 해당 메소드를 호출 할 때 적용됩니다. DML 쿼리를 실행할 때가 아닙니다. 그래서, 가정 docNumber는 엔티티의 ID는, 당신은 단순히 당신이 표준 자바 명명 규칙에 충실하고 이름에 노이즈를 방지한다

Doc_table d = (Doc_table) session.get(Doc_table.class, docNumber); 
session.delete(d); 

주의가 필요합니다. XXX_table 테이블의 이름을 지정하는 것은 쓸모가 없습니다. 엔티티 이름을 XXX_table으로 지정하는 것은 쓸데없고 혼란스럽고 명명 규칙을 따르지 않습니다. 문서 엔터티의 이름은 Document이어야합니다.

0

쿼리를 사용하여 임의 변경을 수행하면 전이 지속성이 아무 것도하지 않습니다. 일반적으로 대량 작업을 수행하고 성능에 대한 우려가 없다면 쿼리를 변경하지 않고 실제 hibernate/jpa API를 사용하는 것이 가장 좋습니다. 그것은 캐싱을 망쳐 버리고, 세션 상태를 깨뜨리는 것이지만, 일반적으로 문제를 해독하기 어려운 방법입니다.

session = HibernateUtils.beginTransaction("emscribedx"); 
    Query q = session.createQuery("from Doc_table where docnumber = :docnum"); 
    q.setParameter("docnum", anumber); 
    List<Doc_table> results = (List<Doc_table>)q.list(); 
    for (Doc_table result: results) { 
    session.delete(result); 
    } 
    session.getTransaction().commit(); 

예. 추가 쿼리가 필요합니다. 최대 절전 모드에 오신 것을 환영합니다! 예쁜 API와 불가사의 한 추상화는 무료가 아닙니다. 실제 ID가 있으면 Session#load을 사용하여이를 피할 수 있습니다. 실제 SELECT 문없이 지연 프록시를 만들 수 있습니다.

+0

Session.get()은 선택 쿼리를 만듭니다. Session.load()는 아무것도로드하지 않습니다 (예, 좋은 이름입니다!). –

+0

으악, 그걸 잡기위한 tx – Affe

+0

당신은 환영합니다 :) –