2012-01-23 62 views
2

我有2班餐食和日子。 一天可以有几顿餐,一顿可以在几天内送达。 我用一天中的所有食物存储一天对象。 和没有类型Day属性的Meal对象。 代码如下:一对多没有外键进入休眠状态

public class Day { 
Date date; 
private Map<Meal, List<Integer>> mealsLines; 

public Day() { 
} .... 
} 


public class Meal implements java.io.Serializable { 
private long id; 
private String name; 

public Meal() { 
} .... 


<hibernate-mapping> 
<class name="data.Day" table="DAY"> 
    <id name="date" type="java.sql.Date" access="field"> 
     <column name="DATE" /> 
     <generator class="assigned" /> 
    </id> 
    <map name="mealsLines" table="MEAL" lazy="true" access="field"> 
     <key> 
      <column name="DATE" /> 
     </key> 
     <map-key type="data.Meal"></map-key> 
     <one-to-many class="data.Meal" /> 
    </map> 
</class> 
</hibernate-mapping> 


<hibernate-mapping> 
<class name="data.Meal" table="MEAL"> 
    <id name="id" type="long"> 
     <column name="ID" /> 
     <generator class="identity" /> 
    </id> 
    <property name="name" type="java.lang.String" access="field"> 
     <column name="NAME" /> 
    </property> 
</class> 
</hibernate-mapping> 

所以现在这些地图,我得到两个表:
膳食
ID名称---->日期< ----错


DATE

这是无稽之谈,因为一顿饭可以在一天以上被切断。 我不想在外面吃饭的外键。我怎么能意识到这一点? 谢谢

+0

_Why_没有你要的外键?您是否可能将外键的数据库级概念与关系的对象级概念和对另一个对象的引用相混淆?它们是不一样的,而且这恰恰是Hibernate的目的......使您可以将概念分开并在它们之间进行映射。 – cdeszaq

回答

5

你不能。通过多天吃一顿饭和一天多餐,你必须必须有一个多对多的关系。

为了做到这一点,你需要必须有一个关联的餐桌和日表之间的表。

默认情况下,如果可能,Hibernate会尝试在表上使用外键,因为它允许数据库帮助确保数据的一致性和正确性,而且由于大多数关系数据库使用外键创建的隐式索引, 。

+0

如何实现这种多对多的关系? – eclipse

+0

阅读hibernate用户指南:http://www.hibernate.org/docs。具体来说,这部分:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/associations.html#assoc-bidirectional-join-m2m – cdeszaq

+0

好吧,我试图用一个很多但现在我无法弄清楚如何写下来。我必须在每个映射文件中写入2 -mapping吗?而且,我如何绘制膳食日子,因为我没有存储这些信息的食物属性。 – eclipse

4

你所要求的是一对多的,而从你的描述来看,似乎需要多对多的关系。你可以实现的方式是创建另一个映射类/表,它将映射其他两个表的外键。

MEAL 
╔════════════╗ 
║ ID* | NAME ║ 
╠════════════╣ 
║ 1 | M1 ║ 
║ 2 | M2 ║ 
╚════════════╝ 

DAY 
╔════════════╗ 
║ ID* | DESC ║ 
╠════════════╣ 
║ D1 | aa ║ 
║ D2 | bb ║ 
╚════════════╝ 

MEAL_DAY_MAPPING 

╔══════════╦═════════╦══════════════════╗ 
║ MEAL_ID* ║ DAY_ID* ║ MEAL_DAY_DETAILS ║ 
╠══════════╬═════════╬══════════════════╣ 
║  1 ║ D1  ║ XXX    ║ 
║  1 ║ D2  ║ YYY    ║ 
║  2 ║ D1  ║ ZZZ    ║ 
╚══════════╩═════════╩══════════════════╝ 

* indicates PK 

参考

+2

注意:使用http://www.sensefulsolutions.com/2010/10/format-text-as-table.html –

+1

生成的表格这是一个杀手级的链接! – adarshr