Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠为组合器外键插入空值_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java 休眠为组合器外键插入空值

Java 休眠为组合器外键插入空值,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我有以下表格结构 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

我有以下表格结构

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表有3个引用RegionId的不同外键约束。一个是直接,另一个是通过客户和产品

下面是Order表的hibernate映射文件

<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>

请告诉我可能出现的错误以及解决问题的建议。

我也有同样的问题,您找到了解决此问题的方法吗?Thanks@aumanets基于大量的google搜索,我得出结论,这是hibernate在这一点上的限制,因此我由DB重新设计,以消除组合PKs。我不认为由于hibernate框架,这是重新设计DB的好方法。可能您为数据引入了冗余,我假设您添加了一个自动递增列,而不是复合键。如果你用不同的方式解决这个问题,你能提供一些提示吗?谢谢。我引入了一个自动增量列并进行了PK。我认为hibernate的坚持可能是正确的。我相信,通过程序逻辑,我可以确保RegionId对于Region和Client都是相同的,但在DB级别,无法确保。因此,我们决定通过为客户机创建一个带有clientId(auto_increment)的表,并在区域和客户机之间添加一个relationTable,从而将其解耦。谢谢,我们可能也会采用这种方法。
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
        (?, ?, ?)