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 | |
+----------+--------------+------+-----+---------+-------+
# 1 楼答案
我认为你不应该在MarketMenuBranch中给你的数据成员命名为“id”,因为这有点让人困惑。我推荐marketMenuBranch。是这样吗
但是,离开上面的内容,你只是引用了你所指的类成员的名称。所以:
您只需指向所创建的容器对象,并将其用作类成员。MarketMenuBranchId也应该被映射,Hibernate将知道如何把id从那里取出来,这就是为什么你不需要把id.marketId放进去
顺便说一句:我不知道整个结构是否正确(这取决于你),但这应该能回答你的具体问题。对我来说,你给XXXId打电话的方式似乎有点误导,但你比我更清楚你的需求
编辑:我还想指出,如果你对数据库有任何控制权,我建议不要使用复合ID。这会让未来的事情变得有点麻烦。系统生成的id更好地遵循规范化规则
# 2 楼答案
也许您应该将MarketMenuBranch映射为复合元素列表:
# 3 楼答案
出现问题是因为有多个属性共享同一列。你的MarketMenuBranch应该是这样的(注意insert=“false”,update=“false”)
Hibernate会问你:我应该保存/更新哪个属性
因此,您应该定义insert=“false”,update=“false”
你是新来冬眠的吗
因此,在保存前,您应该提供复合主键