java - 使用注释设置 Hibernate 模型以允许在 Hibernate 中进行级联删除

标签 java hibernate cascading-deletes

我有两个表,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/

相关文章:

ruby-on-rails - 如何在Rails ActiveRecord中的one_to_many关系中进行级联删除?

java - 而 "!b.equals(x) || !b.equals(y)"是一个无限循环?

java - 我需要帮助将我的堆栈类链接到我的 TestBed 类

java - 在 Java 中使用 2 个 JButton 的问题

java - ProGuard 破坏 JavaFX 应用程序

java - getCurrentSession 在网络中 hibernate

java - JPA - 基类使用什么注释

sql - 为什么setParameter不设置参数?

foreign-keys - 使用外键从两个 h2 表中删除