Java 使用地图收集休眠多对多
我有两张桌子“车站”和“路线”。路线可以包含多个车站,每个车站都可以是不同路线的一部分。合乎逻辑的解决方案是创建一个带有“station\u id”和“route\u id”字段的表,在互联网上有很多例子可以说明如何使用hibernate组织所有这些内容。但我需要存储路由中每个站点的订单号,因此第三个表中填充了另一个字段“orderNumber”,因此我们得到以下结构: 路线Java 使用地图收集休眠多对多,java,hibernate,nhibernate-mapping,many-to-many,Java,Hibernate,Nhibernate Mapping,Many To Many,我有两张桌子“车站”和“路线”。路线可以包含多个车站,每个车站都可以是不同路线的一部分。合乎逻辑的解决方案是创建一个带有“station\u id”和“route\u id”字段的表,在互联网上有很多例子可以说明如何使用hibernate组织所有这些内容。但我需要存储路由中每个站点的订单号,因此第三个表中填充了另一个字段“orderNumber”,因此我们得到以下结构: 路线 路线号 车站id 订单号 我创建了下一个bean: public class Station extends Ide
- 路线号
- 车站id
- 订单号
public class Station extends Identifier{
private String title;
}
public class Route extends Identifier{
private String name;
private Map<Integer, Station> stations = new HashMap<Integer, Station>();
}
公共类电台扩展标识符{
私有字符串标题;
}
公共类路由扩展标识符{
私有字符串名称;
私有映射站=新HashMap();
}
因此,我使用HashMap集合来存储orderNumber变量。
请帮助我使用hibernate映射此类关系或提出其他解决方案。
谢谢。由于您必须在RouteStation表中存储额外信息,因此最好将其升级为完整类。你会得到这样的结果:
public class Station extends Identifier{
private String title;
private List<RouteStation> routes;
}
public class Route extends Identifier{
private String name;
private List<RouteStation> stations;
}
Public class RouteStation{
private Station station;
private Route route;
private Integer orderNumber;
}
<class name="Route" table="Route">
<id name="id" column="routeId" type="long" unsaved-value="-1">
<generator class="native"/>
</id>
<property name="name" column="name" />
<map name="stations" table="RouteStations" cascade="all">
<key column="routeId" />
<map-key-many-to-many column="stationId" class="Station"/>
<element column="orderNumber" type="int"/>
</map>
</class>
公共类电台扩展标识符{
私有字符串标题;
私人名单路线;
}
公共类路由扩展标识符{
私有字符串名称;
私人名单站;
}
公共类公共屋{
私人车站;
专用线路;
私有整数序号;
}
然后可以进行映射,以便RouteStation类拥有Route和Station之间的关系。现在必须创建两个单独的一对多双向映射。
我需要存储路线中每个站点的订单号
为什么不使用列表来代替呢。您只需创建一个链接表
@Entity
public class Route {
private Integer id;
private List<RouteAndStation> stationList = new ArrayList<RouteAndStation>();
@Id
public Integer getId() {
return this.id;
}
@OneToMany(mappedBy="route")
@Cascade(SAVE_UPDATE)
public List<RouteAndStation> getStationList() {
return this.stationList;
}
@Transient
public List<Station> getStationByOrderNumber() {
Collections.sort(this.stationList, new Comparator<RouteAndStation>() {
public int compare(RouteAndStation o1, RouteAndStation o2) {
return o1.getOrderNumber().compareTo(o2.getOrderNumber());
}
});
List<Station> sList = new ArrayList();
for(RouteAndStation routeAndStation: this.stationList)
sList.add(routeAndStation.getStation());
return sList;
}
public void addStation(Station station) {
RouteAndStation routeAndStation = new RouteAndStation();
routeAndStation.addStation(this, station, getStationList().size());
getStationList().add(routeAndStation);
}
}
我希望它能对你有用
问候,非常感谢。但我认为不应该有一个“RouteAndStation”实体。我试图将我的“Route”类映射到数据库中的两个表上,如下所示:
public class Station extends Identifier{
private String title;
private List<RouteStation> routes;
}
public class Route extends Identifier{
private String name;
private List<RouteStation> stations;
}
Public class RouteStation{
private Station station;
private Route route;
private Integer orderNumber;
}
<class name="Route" table="Route">
<id name="id" column="routeId" type="long" unsaved-value="-1">
<generator class="native"/>
</id>
<property name="name" column="name" />
<map name="stations" table="RouteStations" cascade="all">
<key column="routeId" />
<map-key-many-to-many column="stationId" class="Station"/>
<element column="orderNumber" type="int"/>
</map>
</class>
是的,这是显而易见的解决方案,但数据库中的关系模型反映了这里的对象,而我认为对象必须使用对象模型。必须是一种组织多对多的方法,就像我上面回答的那样,但我对此感到困惑。@j3raks只是一个建议:您想使用映射作为避免加入类的一种方法,对吗???但若需要在链接表上添加一个新属性,会发生什么呢???你需要改变你所有的模型。想想看。你的应用不需要知道你加入的课程。如果您看到的话,封装用于隐藏加入的类。谢谢。是的,我看到了封装。我会用你的解决方案。非常感谢。
insert into Route (name) values (?)