在同一类的对象之间指定Hibernate中的双向关系

时间:2013-08-30 16:30:17

标签: hibernate many-to-many bidirectional

我有一个类City,其中一些City对象与其他City对象具有多对多关系。这种关系是姐妹城市关系,例如,城市对象东京可以与城市对象,赫尔辛基和伦敦建立姐妹城市关系,伦敦可以是东京,巴黎和明尼阿波利斯的姐妹城市。 我在这里阅读了文档:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/,特别是2.2.5.3.2.1。关于多对多映射的定义部分。这是我的城市课程:

@Entity
@Table(name = "city")
public class City {
@Id
@Column(name = "city_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long cityID;

@Column(name = "name_txt")
private String cityName;

@OneToOne
@JoinColumn(name = "type_id")
private CityType cityType;

@OneToOne
@JoinColumn(name = "state_id")
private State state;

@Column(name = "population_nbr")
 private int population;

@Column(name = "area_nbr")
private double area;

  /** Mapping Entity Associations */ 

@ManyToMany(
    targetEntity=City.class,
    cascade = CascadeType.PERSIST, fetch = FetchType.EAGER
)
@JoinTable(name="sister_city",
        joinColumns = @JoinColumn(name="city_id"),
        inverseJoinColumns = @JoinColumn(name="sister_city_id")
)
    private List<City> sisterCities;

public City() {
cityType = new CityType();
state = new State();
}
    //Getters and Setters ....

我的关联表名为sister_city,它有三列,id,city_id和sister_city_id。现在我可以创建一个新城市,从选择框中的先前创建的城市中选择姐妹城市,并将城市ID和选定的姐妹城市ID添加到关联表中的正确列。

我的问题是,当我添加新城市Twig并将其交给东京,巴黎和伦敦的姐妹城市时,当我选择巴黎的姐妹城市时,Twig不会与其他姐妹城市一起被选中。我已经阅读了mappedBy参数以及它如何指定多对多关系的所有者端属性,但是当对象来自同一个类时,如何执行此操作?

现在如果Paris有city_id 18和Twig 24,则添加city_id 18 - sister_city_id 24关系,但是city_id 24 - sister_city_id 18关系也不会通过Hibernate自动添加。

1 个答案:

答案 0 :(得分:1)

我认为您遇到了必须单独更新每个双向关系的常见问题。这些关系不会自动发生。因此,您不仅需要将东京,巴黎和伦敦的城市添加到Twig,您必须做相反的事情,对于您刚添加的每个城市,您必须建立相反的关系。换句话说,你必须将Twig添加到东京,巴黎和伦敦。设置每个城市的关系后,请务必调用更新。

我不相信mappedBy参数在这里有意义。有关mappedBy参数的更多信息,请阅读:

Can someone please explain mappedBy in hibernate?