我有两个对象; Document
和DocumentBatch
文献
public class Document implements Serializable {
....
private String documentId; //PK of Document
private DocumentBatch documentBatch;
....}
文档批处理
public class DocumentBatch implements Serializable {
private String batchId;//PK of DocumentBatch
private List<Document> lDocuments = new LinkedList<Document>();
.....
public void insertDocument(Document document) {
lDocuments.add(document); // lDocuments is a list DocumentBatch
document.setDocumentBatch(this);
....}
休眠映射:
文献
<class name="Document" table="DOCUMENTS">
.....
<id name="documentID" column="DOCUMENT_ID" type="string" />
<many-to-one name="documentBatch" class="DocumentBatch" not-null="false"
cascade="save-update" lazy="false" insert="false" update="false">
<column name="BATCH_ID" not-null="true" />
</many-to-one>
......
</class>
文档批处理
<class name="DocumentBatch" table="DOCUMENT_BATCHES">
<id name="batchId" column="BATCH_ID" type="string" />
<list name="lDocuments" table="DOCUMENTS" cascade="all"
inverse="false" lazy="false" mutable="true">
<key not-null="true">
<column name="BATCH_ID" />
</key>
<list-index column="LIST_INDEX" base="0" />
<one-to-many class="Document" />
</list>
......
</class>
DocumentBatch具有文档列表
文档具有batchId,它是DocumentBatch的PK。我已经在Hibernate映射中设置了DocumentBatch中的列表
inverse =“ false”
并在文档中建立多对一关系集insert =“ false” update =“ false”
但是当我尝试保存Document obj时,将不会保存其DocumentBatch。
怎么解决。如果有人可以帮助..希望大家度过一个愉快的周末。
Oracle数据库:
文件的
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));
最佳答案
如果我正确理解您的意思。从您显示的摘录中,我会说您所遇到的行为是正确的。您是说问题是:
但是当我尝试保存Document obj时,它的DocumentBatch不会
保存。
由于存在显式设置,NOT insert和NOT Update:
<many-to-one name="documentBatch" class="DocumentBatch"
not-null="false" cascade="save-update" lazy="false"
insert="false" // Hibernate do not insert
update="false" // Hibernate do not update
>
那么结果是正确的。
如果您想保存与
DocumentBatch
的关系,则只需更改该映射即可:insert="true" // Hibernate DO insert
update="true" // Hibernate DO update
(或删除它们,因为默认值为
true
),然后,如果将DocumentBatch
分配给Document
并保存,则所有内容将正确保存。这应该解决。编辑:重复的列异常
我猜您的实体
Document
具有另一个映射到batch_id
的字段。<many-to-one name="documentBatch" class="DocumentBatch" not-null="false"
cascade="save-update" lazy="false" insert="false" update="false">
<column name="BATCH_ID" not-null="true" />
</many-to-one>
// this is not in the snippet above, but I guess it is there
<property name="batchId" column="BATCH_ID"/>
并在代码中:
public class Document implements Serializable {
private String documentId; //PK of Document
private DocumentBatch documentBatch;
// this is not in the snippet above, but I guess it is there
private String batchId;
....}
如果是这种情况,那么会将两个不同的属性映射到同一列,这就是我们遇到以下原因的原因:
duplicated column exception
如果我的期望是正确的,请通过以下方式更改映射:
<many-to-one name="documentBatch" class="DocumentBatch" not-null="false"
cascade="save-update" lazy="false" > // insert and update removed
<column name="BATCH_ID" not-null="true" />
</many-to-one>
<property name="batchId" formula="[BATCH_ID]" insert="false" update="false"/>
因此,
documentBatch
将用于插入和更新,而batchId仅用于只读。