1

我有两个对象;DocumentDocumentBatch

文档

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 有一个 Document 列表

文档有 batchId,它是 DocumentBatch 的 PK。我已经在 DocumentBatch 中设置了 Hibernate 列表的映射

逆=“假”

并在 Document 中的多对一关系集 insert="false" update="false"

但是当我尝试保存一个 Document obj 时,它的 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);

DocumentBatch 的

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

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

1 回答 1

3

如果我理解正确的话。从您展示的片段中,我会说您遇到的行为是正确的。你说的问题是:

但是当我尝试保存一个 Document obj 时,它的 DocumentBatch 将不会被保存。

因为有明确的设置不插入和不更新:

<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,然后如果您将 a 分配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将用于insertupdate,而 batchId 将仅用于只读。

于 2012-11-16T16:22:58.250 回答