我有两个表,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 中的条目,但不会将删除级联到 Code_table。下面是我正在使用的 Doc_table 的带注释模型。请注意,我使用cascadeType.All 注释了一对多关系。但我仍然没有得到预期的级联删除。
对正在发生的事情有什么想法吗?
导入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_;
}
最佳答案
当您在 session 上调用相应的方法时,将应用级联。执行 DML 查询时不会。因此,假设 docNumber 是实体的 ID,您只需要
Doc_table d = (Doc_table) session.get(Doc_table.class, docNumber);
session.delete(d);
请注意,您应该遵守标准 Java 命名约定,并避免名称中出现杂音。将表命名为 XXX_table 是没有用的。命名实体 XXX_table 毫无用处,而且令人困惑,并且不遵守命名约定。文档实体应命名为Document
。
关于java - 使用注释设置 Hibernate 模型以允许在 Hibernate 中进行级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21840690/