有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当不是对象本身的属性时,如何在manytone关系上指定外键?

我正在尝试将MarketMenuBranch和Market之间的多对一关系映射到一起。我的课看起来像:

public class Market implements Serializable {
    private int id;
    private String name;
    private List<MarketMenuBranch> marketMenuBranches;
    // accessors / mutators etc...

public class MarketMenuBranch implements Serializable {
    private MarketMenuBranchId id;
    private String name;
    // accessors / mutators etc...

public class MarketMenuBranchId implements Serializable {
    private int marketId;
    private int sequence;
   // accessors / mutators etc...

但我不知道我能为房产名称写些什么(我在下面有???)。我真的很想把id市场化,但这似乎是错误的

<class name="MarketMenuBranch" table="MARKET_MENU_BRANCH">
    <composite-id name="id" class="MarketMenuBranchId">
        <key-property name="marketId"/>
        <key-property name="sequence"/>
    </composite-id>
    <property name="name"/>
    <many-to-one name="????????"/>
</class>

我该怎么做

编辑:以下是市场地图:

<class name="Market" table="MARKET">
    <id name="id"/>
    <property name="name"/>
    <list name="marketMenuBranches" inverse="true" cascade="all-delete-orphan">
        <key column="marketId"/>
        <list-index column="sequence"/>
        <one-to-many class="MarketMenuBranch"/>
    </list>
</class>

这是我的桌子:

mysql> describe MARKET;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       | 
| name  | varchar(100) | YES  |     | NULL    |       | 
+-------+--------------+------+-----+---------+-------+

mysql> describe MARKET_MENU_BRANCH;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| marketId | int(11)      | NO   | PRI | 0       |       | 
| sequence | int(11)      | NO   | PRI | 0       |       | 
| name     | varchar(100) | YES  |     | NULL    |       | 
+----------+--------------+------+-----+---------+-------+

共 (3) 个答案

  1. # 1 楼答案

    我认为你不应该在MarketMenuBranch中给你的数据成员命名为“id”,因为这有点让人困惑。我推荐marketMenuBranch。是这样吗

    但是,离开上面的内容,你只是引用了你所指的类成员的名称。所以:

    <many-to-one name="id" column="column_name" class="MarketMenuBranchId"/>
    

    您只需指向所创建的容器对象,并将其用作类成员。MarketMenuBranchId也应该被映射,Hibernate将知道如何把id从那里取出来,这就是为什么你不需要把id.marketId放进去

    顺便说一句:我不知道整个结构是否正确(这取决于你),但这应该能回答你的具体问题。对我来说,你给XXXId打电话的方式似乎有点误导,但你比我更清楚你的需求

    编辑:我还想指出,如果你对数据库有任何控制权,我建议不要使用复合ID。这会让未来的事情变得有点麻烦。系统生成的id更好地遵循规范化规则

  2. # 2 楼答案

    也许您应该将MarketMenuBranch映射为复合元素列表:

    <class name="Market" table="MARKET">
        ...
        <list cascade="all-delete-orphan" name="marketMenuBranches" table="MARKET_MENU_BRANCH">
          <key column="MARKET_ID"/>
          <list-index column="SEQUENCE"/>
          <composite-element class="MarketMenuBranch">
            <property column="NAME" name="name"/>
          </composite-element>
        </list>
    
  3. # 3 楼答案

    出现问题是因为有多个属性共享同一列。你的MarketMenuBranch应该是这样的(注意insert=“false”,update=“false”)

    <class name="MarketMenuBranch" table="MARKET_MENU_BRANCH">
        <composite-id name="id" class="MarketMenuBranchId">
            <! Ops... A property whose mapped column is called marketId >
            <key-property name="marketId"/>
            <key-property name="sequence"/>
        </composite-id>
        <property name="name"/>
        <! Ops... Other property whose mapped column is called marketId >
        <many-to-one name="market" column="marketId" insert="false" update="false"/>
    </class>
    

    Hibernate会问你:我应该保存/更新哪个属性

    因此,您应该定义insert=“false”,update=“false”

    你是新来冬眠的吗

    Keep this in mind: Hibernate does not support automatic generation of composite primary key

    因此,在保存前,您应该提供复合主键