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