简体   繁体   English

Hibernate JPA,向多对多表添加数据时遇到问题

[英]Hibernate JPA, Problems adding data to a many to many table

I am creating a database and am having trouble getting the data to add to the many to many table connecting the operators to the routes they operate. 我正在创建一个数据库,无法将数据添加到将操作员连接到他们所操作的路线的多对多表中。 All other data adds fine and I have absolutely no idea how to fix this. 所有其他数据都很好,我绝对不知道如何解决此问题。

Here's an extract from the console return, it shows that the operates table, the one I am failing to add too, has a different message 这是从控制台返回的摘录,它表明操作表(我也没有添加该表)具有不同的消息

Hibernate: 
alter table operates 
    add index FKE22A276FF12BFD7F (number), 
    add constraint FKE22A276FF12BFD7F 
    foreign key (number) 
    references route (number)
Hibernate: 
alter table operates 
    add index FKE22A276FC0CF67CB (name), 
    add constraint FKE22A276FC0CF67CB 
    foreign key (name) 
    references operator (name)
Hibernate: 
insert 
into
    bus_stop
    (description, id) 
values
    (?, ?)
Hibernate: 
insert 
into
    bus_stop
    (description, id) 
values
    (?, ?)

Here's some of my code, have left out the get and set methods since they will be fine: 这是我的一些代码,因为可以使用,所以省略了get和set方法:

Route 路线

@Entity
@NamedQueries({
    @NamedQuery(name = Route.SELECT_ALL, query = "select r from Route r 
order by r.number asc")
})
@Table(name = "route")
public class Route {
    @Id  @Column(name="number")
    private String number;

    private int frequency;
    private String start;
private String destination;

@ManyToMany(
        cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy = "routes",
        targetEntity = Operator.class)
private Set<Operator> operators = new HashSet<Operator>();

Operator 操作者

@Entity
@NamedQueries({
    @NamedQuery(name = Operator.SELECT_ALL, query = "select o from Operator 
 o order by o.name asc")
 })
 @Table(name = "operator")
 public class Operator {

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

private String street;
private String town;
private String postcode;
private String email;
private String phone;

@ManyToMany(
        targetEntity=Route.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="operates",
        joinColumns=@JoinColumn(name="name"),
        inverseJoinColumns=@JoinColumn(name="number")
    )
private Set<Route> routes;

and the respective insert statements 以及相应的插入语句

    public static Session insert(final Map<String, String> row, Session session) {
    Operator o = new Operator();
    o.setRoutes(new HashSet<Route>());

    for (String key : row.keySet()) {
        if(key.equals("name"))
            o.setName(row.get(key));
        else if(key.equals("street"))
            o.setStreet(row.get(key));
        else if(key.equals("town"))
            o.setTown(row.get(key));
        else if(key.equals("postcode"))
            o.setPostcode(row.get(key));
        else if(key.equals("email"))
            o.setEmail(row.get(key));
        else if(key.equals("phone"))
            o.setPhone(row.get(key));
    }
    session.save(o);

    return session; 

public static Session insert(final Map<String, String> row, final Session session) {

        Route r = new Route();
        r.setOperators(new HashSet<Operator>());

        for (String key : row.keySet()) {
            if(key.equals("number"))
                r.setNumber(row.get(key));
            else if(key.equals("frequency"))
                r.setFrequency(Integer.parseInt(row.get(key)));
            else if(key.equals("start"))
                r.setStart(row.get(key));
            else if(key.equals("destination"))
                    r.setDestination(row.get(key));
            else if(key.equals("operators")){
                Set<String> operatorStrings = new HashSet<String>(Arrays.asList(row.get(key).split("|")));

                Operator o = new Operator();
                for(String s : operatorStrings){
                    o.setName(s);
                    r.getOperators().add(o);
                }
            }
        }

        session.save(r);

        return session;
    }

extra for comment 额外的评论

    Route r = new Route();
    r.setOperators(new HashSet<Operator>());

    for (String key : row.keySet()) {
        if(key.equals("number"))
            r.setNumber(row.get(key));
        else if(key.equals("frequency"))
            r.setFrequency(Integer.parseInt(row.get(key)));
        else if(key.equals("start"))
            r.setStart(row.get(key));
        else if(key.equals("destination"))
                r.setDestination(row.get(key));
        else if(key.equals("operators")){
            Set<String> operatorStrings = new HashSet<String>(Arrays.asList(row.get(key).split("|")));


            Operator o = new Operator();
            for(String s : operatorStrings){                    
                o.setName(s);
                o.setRoutes(new HashSet<Route>());
                o.getRoutes().add(r);
                r.getOperators().add(o);
            }
        }
    }

When adding Oerator or Route make sure that Route is in Operators.routes collection and operator is in Route.operators 添加Oerator或Route时,请确保RouteOperators.routes集合中,并且operator在Route.operators

In Route do: 在路线上:

public void addOperator(Operator o){
operators.add(o);
o.addRoute(this);
}

In Operator do: 在运算符中执行:

public void addRoute(Route r){
routes.add(r);
r.addOperator(this);
}

And the same do when removing route or operator. 和删除路线或运营商时一样。 This ensures that both sides of many-to-many relation are in sync. 这样可以确保多对多关系的双方保持同步。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM