Java Hibernate在列表中保存新元素,而不删除旧元素

Java Hibernate在列表中保存新元素,而不删除旧元素,java,hibernate,list,Java,Hibernate,List,我有两个OBJ文档和文档批处理 文件 文档批处理 CREATE TABLE DOCUMENT_BATCHES( BATCH_ID VARCHAR2(255 CHAR) NOT NULL ...); ALTER TABLE DOCUMENT_BATCHES ADD ( PRIMARY KEY (BATCH_ID)); 类DocumentBatch中的和Methode insertDocument(文档文档文档): public class DocumentBath{ ..... pri

我有两个OBJ<代码>文档和
文档批处理

文件

文档批处理

CREATE TABLE DOCUMENT_BATCHES(
BATCH_ID VARCHAR2(255 CHAR)     NOT NULL
...);

ALTER TABLE DOCUMENT_BATCHES ADD (
PRIMARY KEY (BATCH_ID));
类DocumentBatch中的和Methode insertDocument(文档文档文档):

public class DocumentBath{
.....
private List<Document> lDocuments = new LinkedList<Document>();
.....
public void insertDocument(Document document) {
    lDocuments.add(document); // lDocuments is a list DocumentBatch
    document.setDocumentBatch(this);
}
.....}
文档批处理

CREATE TABLE DOCUMENT_BATCHES(
BATCH_ID VARCHAR2(255 CHAR)     NOT NULL
...);

ALTER TABLE DOCUMENT_BATCHES ADD (
PRIMARY KEY (BATCH_ID));

好了。在您的测试用例中,您正在为数据库中已经存在的实体创建新的实体对象。这会混淆hibernate&hibernate不支持删除现有文档

String batchId = "500700";
    DocumentBatch documentBatch = new DocumentBatch(batchId, name);
首先使用get()或load()获取id为500700的现有DocumentBatch对象,而不是使用此“new DocumentBatch(batchId,name)”。获取现有对象后,请执行以下步骤

1) 创建一个方法,例如clearExistingDocuments()。在这个方法中,首先迭代文档列表&使BATCH_ID为null。迭代完成后,从列表中删除所有这些文档

2) 现在在同一个空列表中添加新创建的文档。避免创建新的列表实例。使用相同的空列表实例并添加新文档

String batchId = "500700";
    DocumentBatch documentBatch = new DocumentBatch(batchId, name);

这应该可以解决问题。由于这些步骤,hibernate将知道最初存在一些现有值&现在这些值被显式删除,因此hibernate将触发相关的删除查询。如果需要,也可以使用孤立删除。这将删除孤立文档对象,而不是将它们保留在文档表中。

在调用saveOrUpdate之前,您能否提供获取或创建documentBatch的代码。需要检查documentBatch对象是从DB获取的,还是每次都使用相同的id新建的??感谢您的快速回复。我刚刚更新了原始帖子。来自DocumentBatch类中的列表obj——private List lDocuments=new LinkedList();你的回答很自然。您知道,我可以说服Hibernate相信新创建的Id为500700的DocumentBatch就是DB中的DocumentBatch,但没有文档列表。因此,如果有人只是创建一个新的DocumentBatch,而不询问它是否已经存在,那么它将是不安全的。
CREATE TABLE DOCUMENTS(
DOCUMENT_ID VARCHAR2(255 CHAR) NOT NULL,
BATCH_ID VARCHAR2(255 CHAR) NOT NULL,
...);  


CREATE UNIQUE INDEX PK_DOCUMENT ON DOCUMENTS (DOCUMENT_ID); 
ALTER TABLE DOCUMENTS ADD (CONSTRAINT PK_DOCUMENT PRIMARY KEY (DOCUMENT_ID) USING INDEX PK_DOCUMENT); 

ALTER TABLE DOCUMENTS ADD (CONSTRAINT FK_DOCUMENT_BATCH_ID FOREIGN KEY (BATCH_ID) REFERENCES DOCUMENT_BATCHES (BATCH_ID) ON DELETE CASCADE);
CREATE TABLE DOCUMENT_BATCHES(
BATCH_ID VARCHAR2(255 CHAR)     NOT NULL
...);

ALTER TABLE DOCUMENT_BATCHES ADD (
PRIMARY KEY (BATCH_ID));
String batchId = "500700";
    DocumentBatch documentBatch = new DocumentBatch(batchId, name);