Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 JPA注释-如何将两个字段合并为一个联接表的一列?_Java_Mysql_Hibernate_Jpa_Jdbc - Fatal编程技术网

Java JPA注释-如何将两个字段合并为一个联接表的一列?

Java JPA注释-如何将两个字段合并为一个联接表的一列?,java,mysql,hibernate,jpa,jdbc,Java,Mysql,Hibernate,Jpa,Jdbc,所以我有两门课,一条路线和一个公共汽车站。路由“使用”两个总线站对象,一个作为起点,一个作为终点。我需要通过联接表“Uses”映射此关系 此联接表不需要区分总线停止是用于起点还是终点。基本上,我只需要将start和destination变成一个列,在这个连接表中允许有重复项,这样我就可以得到哪个路由使用哪个站点的完整映射 下面是我如何设置它的假设getter和setter在那里: public class Route { @Id private String number;

所以我有两门课,一条路线和一个公共汽车站。路由“使用”两个总线站对象,一个作为起点,一个作为终点。我需要通过联接表“Uses”映射此关系

此联接表不需要区分总线停止是用于起点还是终点。基本上,我只需要将start和destination变成一个列,在这个连接表中允许有重复项,这样我就可以得到哪个路由使用哪个站点的完整映射

下面是我如何设置它的假设getter和setter在那里:

public class Route {
    @Id
    private String number;

    @Column(nullable = false)
    private int frequency;

    @ManyToOne
    @JoinTable(
        name = "Uses",
        joinColumns = @JoinColumn(name = "number"),
        inverseJoinColumns = @JoinColumn(name = "id")
    )
    private BusStop start;

    @ManyToOne
    @JoinTable(
        name = "Uses",
        joinColumns = @JoinColumn(name = "number"),
        inverseJoinColumns = @JoinColumn(name = "id")
    )
    private BusStop destination;
    ...
}

public class BusStop {
    @Id
    private int id;

    @Column(nullable = false)
    private String description;

    @OneToMany
    @JoinTable(
        name = "Uses",
        joinColumns = @JoinColumn(name = "id"),
        inverseJoinColumns = @JoinColumn(name = "number")
    )
    private Set<Route> routes;
    ...
}
现在我遇到的问题是,这导致了一个“Uses”表,其中每个路由id只有一个,尽管它成功地保留了重复的站点id。我假设这与我试图在Route类中创建两个“Uses”表有关


那么正确的方法是什么呢?

我会选择更干净的方法

这里是我的实体

package com.ansh.entity;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Table(name = "routes")
@Getter @Setter
public class Route {

    @Id
    @Column(name = "number")
    private String number;

    @Column(name = "frequency", nullable = false)
    private int frequency;

    @ManyToOne
    @JoinColumn(name = "start_id")
    private BusStop start;

    @ManyToOne
    @JoinColumn(name = "destination_id")
    private BusStop destination;
}


谢谢,我知道这样做,我可能会求助于。。但这项工作是为了分配任务,我们被特别要求创建一个“Uses”联接表。根本没有办法让它工作吗?你能解释一下公共汽车站与路线的关系吗。是一个女人是什么方式?一对多,其中公共汽车站是起点或终点,或两者兼而有之。公共汽车站到路线是一对多,因为一个公共汽车站被许多路线使用,至少我是这样想的。我想这可能会被认为是很多,但这意味着在Route类中合并start和destination,这我做不到你做不到,因为你随后无法知道它代表哪个FK start或destination。假设您创建了一个公交车站,然后向其中添加了一条路线,因为公交车站拥有该关系。。。路线如何知道它是起点还是终点?数据库中没有知道这一点的信息。如果要检索路由,请转到联接表,但无法知道它的起点和终点。如果公共汽车站中有两组路由,如何?传入和传出?我也觉得路线应该有关系吗?无论如何,谢谢你,我可能会放弃连接表,因为2组是标准的方法,是的,如果我有两组路由,我能让这个“使用”连接表更好地工作吗?如果是,怎么做?我目前的问题是,每条路线只有一个站点被输入ITA,这一切都取决于ITA。一条路线实际上应该有多个站点,以便在路线中列出一个列表,而不仅仅是起点和终点。。。因为巴士在这两条路之间的某个地方行驶。。。但这一部分在你的系统中可能没有价值,只有你知道。回到您的问题,用Java术语来说,一个集合中通常可以有一个特定的对象,而一个列表或多集合可以有重复的对象。
package com.ansh.entity;

import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "bus_stops")
@Getter @Setter
public class BusStop {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "description", nullable = false)
    private String description;

    @OneToMany(mappedBy = "start")
    private Set<Route> outgoingRoutes = Sets.newHashSet();

    @OneToMany(mappedBy = "destination")
    private Set<Route> incomingRoutes = Sets.newHashSet();

    public Set<Route> getRoutes() {
        return Sets.union(outgoingRoutes, incomingRoutes);
    }
}