Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用地图收集休眠多对多_Java_Hibernate_Nhibernate Mapping_Many To Many - Fatal编程技术网

Java 使用地图收集休眠多对多

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

我有两张桌子“车站”和“路线”。路线可以包含多个车站,每个车站都可以是不同路线的一部分。合乎逻辑的解决方案是创建一个带有“station\u id”和“route\u id”字段的表,在互联网上有很多例子可以说明如何使用hibernate组织所有这些内容。但我需要存储路由中每个站点的订单号,因此第三个表中填充了另一个字段“orderNumber”,因此我们得到以下结构:

路线
  • 路线号
  • 车站id
  • 订单号
我创建了下一个bean:

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 (?)