1

次のテーブル構造があります。

Region table {
`RegionId` int(11) NOT NULL AUTO_INCREMENT,
`RegionName` varchar(45) DEFAULT NULL,
PRIMARY KEY (`RegionId`) }

Client table {
`RegionId` int(11) NOT NULL,
`ClientName` varchar(45) NOT NULL,
PRIMARY KEY (`RegionId`, `ClientName`) ,
KEY `Client_RegionId_FK` (`RegionId`),
CONSTRAINT `Client_RegionId_FK` FOREIGN KEY (`RegionId`) REFERENCES `Region` (`RegionId`) ON DELETE NO ACTION ON UPDATE NO ACTION
}

Product table {
`RegionId` int(11) NOT NULL ,
`ProductId` varchar(45) NOT NULL,
`ProductName` varchar(45) DEFAULT NULL, 
PRIMARY KEY (`RegionId`, `ProductId`),
KEY `Product_RegionId_FK` (`RegionId`),
CONSTRAINT `Product_RegionId_FK` FOREIGN KEY (`RegionId`) REFERENCES `Region` (`RegionId`) ON DELETE NO ACTION ON UPDATE NO ACTION
}

Order table {
`OrderId` int(11) NOT NULL AUTO_INCREMENT,
`RegionId` int(11) DEFAULT NULL,
  `ClientName` varchar(45) DEFAULT NULL,
`ProductId` int(11) DEFAULT NULL,
`OrderDate` datetime DEFAULT NULL,
 `OrderValue` int(11) DEFAULT NULL,
PRIMARY KEY (`OrderId`) ,
 KEY `Order_RegionId_FK` (`RegionId`),
KEY `Order_ClientName_FK` (`RegionId`,`ClientName`),
KEY `Order_ProductId_FK` (`RegionId`,`ProductId`),
CONSTRAINT `Order_RegionId_FK` FOREIGN KEY (`RegionId`) REFERENCES `Region` (`RegionId`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `Order_ClientName_FK` FOREIGN KEY (`RegionId`, `ClientName`) REFERENCES `Client` (`RegionId`, `ClientName`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `Order_ProductId_FK` FOREIGN KEY (`RegionId`, `ProductId`) REFERENCES `Product` (`RegionId`, `ProductId`) ON DELETE NO ACTION ON UPDATE NO ACTION
}

order テーブルには、RegionId を参照する 3 つの異なる外部キー制約があります。1 つは直接、もう 2 つはクライアントと製品を介して行われます。

以下は、Order テーブルの休止状態のマッピング ファイルです。

<hibernate-mapping>
<class name="com.test.model.Order" table="Order">
    <id name="orderId" type="java.lang.Integer">
        <column name="OrderId" />
        <generator class="identity" />
    </id>
    <many-to-one name="Region" class="com.test.model.Region" fetch="select">
        <column name="RegionId" />
    </many-to-one>
    <many-to-one name="product" class="com.test.model.Product" update="false" insert="false" fetch="select">
        <column name="RegionId" />
        <column name="ProductId" />
    </many-to-one>
    <many-to-one name="client" class="com.test.model.Client" update="false" insert="false" fetch="select">
        <column name="RegionId" />
        <column name="ClientName" length="45" />
    </many-to-one>
    <property name="orderDate" type="timestamp">
        <column name="OrderDate" length="19" />
    </property>
    <property name="orderValue" type="java.lang.Integer">
        <column name="OrderValue"  />
    </property>
</class>
</hibernate-mapping>

私が抱えている問題は、DB NULL に新しい注文を挿入すると、clientName と ProductId に挿入されることです。永続化する前に、Client オブジェクトと Product オブジェクトを Order Model オブジェクトに提供していることを確認しました。しかし、何らかの理由で NULL が挿入されます。正しく追加されたリージョン情報に問題はありません。

Hibernate の SQL をデバッグして確認しようとしましたが、挿入前に hibernate が Client および Product テーブルを読み込もうとしていることがわかりましたが、驚くべきことに、clientName と productId は挿入順序ステートメントの一部ではありません。

以下はHibernate sqlの出力です

Hibernate: 
/* get current state com.test.model.Product */ select
    product_.RegionId,
    product_.ProductId,
    product_.ProductName as ProductName12_
from
    testdb.product product_ 
where
    product_.RegionId=? 
    and product_.ProductId=?
Hibernate: 
/* get current state com.test.model.Client */ select
    client_.RegionId,
    client_.ClientName 
from
    testdb.client client_ 
where
    client_.RegionId=? 
    and client_.ClientName=?
Hibernate: 
/* insert com.test.model.Order
    */ insert 
    into
        testdb.order
        (RegionId, OrderDate, OrderValue) 
    values
        (?, ?, ?)

何が間違っているのか、問題を解決するための提案を教えてください。

4

0 に答える 0