我正在使用Hibernate 3.6版本,带有xml映射文件。在我的例子中,我有三个映射实体,分别是检测器,天线和位置。基本上,有Detector
- &gt; Set<Antenna>
和Location
- &gt; Set<Antenna>
关系,我希望Detector
- &gt; {{1}可用。
每个探测器都有一组天线实体,映射如下:
Set<Location>
每个天线也属于特定的位置和特定的探测器。这是多对一映射,用于引用:
<set name="_Antennas" table="tantenna" inverse="true" cascade="all">
<key>
<column name="id_detector" not-null="true" />
</key>
<one-to-many class="Antenna" />
</set>
同样,位置有一组天线:
<many-to-one name="_Detector" class="com.tadic.model.detector.Detector"
column="id_detector" />
<many-to-one name="_Location" class="com.tadic.model.location.Location"
column="id_location" />
所以探测器知道它的天线,天线知道它们的探测器和位置。位置实体有一组天线,但 tlocation 表没有外键。
但是,我有兴趣知道某个特定点的探测器的所有位置。我知道我可以编写HQL,但是我想知道当Detector加载时这是否可行,只是将其映射为一组位置实体。
请记住 tlocation 表没有 iddetector 列来链接它,我认为没有必要。
答案 0 :(得分:2)
如果我从数据库点得到它
tdetector [1] - [id_detector] - &gt; [n] tantenna
tlocation [1] - [id_location] - &gt; [m] tantenna
含义tantenna有一个列元组(id_detector,id_location),实际上是tdetector和tlocation之间的链接表。这可用于促进探测器和位置之间的多对多映射。
这是Detector hibernate映射的映射片段。
<set name="locations" table="tantenna">
<key column="id_detector" />
<many-to-many class="com.tadic.model.location.Location" column="id_location" />
</set>
还有一件事。根据我的经验,在ORM上映射这种复杂的关系方案并非没有成本。即使hibernate在会话工厂初始化期间发现您的映射文件没问题,我也建议您进行彻底测试,并在必要时使用insert =“false”update将某些关系指定为只读(即仅在读取数据时有用) = “假”。