次のテーブル構造があります。
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
(?, ?, ?)
何が間違っているのか、問題を解決するための提案を教えてください。