【问题标题】:Hibernate: How return a composite-id?Hibernate:如何返回复合 ID?
【发布时间】:2011-03-01 23:25:51
【问题描述】:

我有这个复合 ID:

<composite-id class="Entities.PackageId" name="id">
  <key-property name="id" type="int">
    <column name="id"/>
  </key-property>
  <key-property name="idProduct" type="int">
    <column name="idProduct"/>
  </key-property>
</composite-id>

实际上,我想在包和产品 ID 中使用自动增量。 但看起来我做不到。

所以,我必须生成一个 id 来打包,(产品已经有自动增量键),所以我的 id 是从 package.id + 1 中取最大值,所以这样我的包就有了一个新的 id .

有什么想法吗?

最好的问候, 瓦尔特·恩里克。

--

DDL:

DROP TABLE IF EXISTS `Product`;
CREATE TABLE `Product` (
  `id` int(11) NOT NULL,
  `name` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `package`;
CREATE TABLE `package` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idProduct` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  `mode` char(1) NOT NULL,
  `unity` varchar(25) NOT NULL,
  `description` varchar(150) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`,`idProduct`),
  KEY `email` (`email`),
  KEY `idProduct` (`idProduct`),
  CONSTRAINT `package_ibfk_1` FOREIGN KEY (`email`) REFERENCES `usuario` (`email`),
  CONSTRAINT `package_ibfk_2` FOREIGN KEY (`idProduct`) REFERENCES `Product` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `name` varchar(50) NOT NULL,
  `lastname` varchar(100) NOT NULL,
  `gender` varchar(9) NOT NULL,
  `birthday` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `email` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `street` varchar(100) DEFAULT NULL,
  `number` int(11) DEFAULT NULL,
  `complement` varchar(100) DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL,
  `state` varchar(100) DEFAULT NULL,
  `country` varchar(100) DEFAULT NULL,
  `image` varchar(100) DEFAULT NULL,
  `telephone` int(12) DEFAULT NULL,
  `cellphone` int(12) DEFAULT NULL,
  `lat` double DEFAULT NULL,
  `long` double DEFAULT NULL,
  PRIMARY KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

映射.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 25/02/2011 15:56:00 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
  <class catalog="p2p" name="Entities.Package" table="Package">
    <composite-id class="Entities.PackageId" name="id">
      <key-property name="id" type="int">
        <column name="id"/>
      </key-property>
      <key-property name="idProduct" type="int">
        <column name="idProduct"/>
      </key-property>
    </composite-id>
    <many-to-one class="Entities.User" fetch="select" name="User">
      <column length="50" name="email" not-null="true"/>
    </many-to-one>
    <many-to-one class="Entities.Product" fetch="select" insert="false" name="Product" update="false">
      <column name="idProduct" not-null="true"/>
    </many-to-one>
    <property name="quantity" type="int">
      <column name="quantity" not-null="true"/>
    </property>
    <property name="mode" type="char">
      <column length="1" name="mode" not-null="true"/>
    </property>
    <property name="unity" type="string">
      <column length="25" name="unity" not-null="true"/>
    </property>
    <property name="description" type="string">
      <column length="150" name="description" not-null="true"/>
    </property>
  </class>
</hibernate-mapping>

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    复合 ID 通常意味着列将引用其他表。它们在其他表中自动递增是有意义的,而不是在这个表中。

    如果它们都是自动递增的,那么就不需要复合 id - 每一列都能够唯一地标识行。

    如果您想让引用的实体具有自动递增的值,请检查thisthis 问题(对于基于 xml 和注释的方法)

    【讨论】:

    • 但 Netbeans 会根据我的数据库自动生成此映射。在我的 db 包中有一个产品 id,一个外键。错了吗?
    • @Valter Henrique 所以 netbeans 知道你的模式。我没有;)
    • @Valter Henrique 使用相关表格的简短 DDL 更新您的答案。
    • 我是 hibernate 新手,所以我不知道 NetBeans 生成的这个映射是否真的是正确的。是吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2021-11-25
    • 2019-08-26
    • 2017-10-14
    • 1970-01-01
    • 2011-11-28
    • 2010-09-18
    相关资源
    最近更新 更多