Java Hibernate在列表中保存新元素,而不删除旧元素
我有两个OBJ<代码>文档和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
文档批处理
文件
文档批处理
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);