0

我正在使用带有 xml 映射文件的 Hibernate 3.6 版本。在我的例子中,我有三个映射实体,它们是DetectorAntennaLocation。基本上,有Detector->Set<Antenna>Location->Set<Antenna>关系,我也希望Detector->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" />

同样,Location也有一组 Antennas:

<set name="_Antennas" table="tantenna">
    <key>
        <column name="id_location" />
    </key>
    <one-to-many class="com.tadic.model.detector.Antenna" />
</set>

所以 Detector 知道它的 Antennas,Antennas 知道它们的 Detector 和 Location。位置实体有一组天线,但位置表没有外键。

但是,我有兴趣了解探测器在特定点的所有位置。我知道我可以编写 HQL,但我想知道在 Detector 加载时这是否可行,只需将其映射为一组 Location 实体。

记住tlocation表没有iddetector列可以与之链接,我也认为没有必要。

4

1 回答 1

2

如果我从数据库点得到它

tdetector [1]--[id_detector]-->[n] 天线

tlocation [1]--[id_location]-->[m] 天线

含义 tantenna 有一个 (id_detector, id_location) 的列元组,本质上是 tdetector 和 tlocation 之间的链接表。这可用于促进检测器和位置之间的多对多映射。

这是检测器休眠映射的映射片段。

<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 指定一些关系为只读(即仅在读取数据时有用) =“假”。

于 2013-07-10T16:12:29.437 回答