gpt4 book ai didi

java - 没有第三张表的一对多关联

转载 作者:行者123 更新时间:2023-11-30 06:21:24 25 4
gpt4 key购买 nike

好的,所以今天我尝试了一个基本的 Hibernate 教程,我正在努力让它按照我想要的方式运行。

这是一个简单的片段,假设所有其他字段/方法都已定义(例如 id 等)

@Entity
@Table(name = "CITIES")
public static class City {

@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private Country country;


}


@Entity
@Table(name = "COUNTRIES")
public static class Country {

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<City> cities;
}

上述解决方案使用了一个(自动创建的)关联表 - COUNTRY_CITIES,但是这仅以一种方式起作用 - 即我看到国家/地区的城市(当我选择一个城市时),但我看不到城市/国家/地区(当我选择城市时)。

那么我应该怎么做才能让城市看到他们的国家?

我可以将 @JoinColumn(name = "COUNTRY_ID") 添加到 Country.cities 字段,它以两种方式工作。

但我不喜欢从国家代码向城市表添加列。

所以我将 @JoinColumn 添加到 City.country 字段,但没有用。

那么 - 如何在没有关联表的情况下以两种方式使关联工作?


好吧,准确地说:我用上面的代码添加了这个对象的数据库:

    Country germany = new Country("Germany", new HashSet<>(asList(
new City("Berlin"),
new City("Hamburg")
)));

.. 并查看了数据库。它看起来像这样:

表 COUNTRIES_CITIES(注意,我没有声明它;Hibernate 会自动声明)

COUNTRIES_ID   CITIES_ID  
1 1
1 2

表格国家

ID      NAME  
1 Germany

CITIES 表(注意我没有声明 COUNTRY_ID 列!再次 hibernate ..)

ID   NAME      COUNTRY_ID  
1 Berlin null
2 Hamburg null

就是这样。获取国家给我城市,获取城市给我空国家。


如果我将 @JoinColumn 添加到 Country 类,则 a 列将附加到 CITIES 表,并且提取工作有两种方式.

最佳答案

看完你的编辑问题就很清楚了。

您添加城市并与国家关联的方式...

Country germany = new Country("Germany", new HashSet<>(asList(
new City("Berlin"),
new City("Hamburg")
)));

如果你这样做,那么城市就没有国家。没有你在哪里设置城市的国家属性(property)。 IE。 city.country = 德国;
双向关系中,您不能依赖 JPA 或您的提供商来为您完全管理对象持久性。

所以这就是你需要做的..

Country germany = new Country("Germany");
City berlin = new City("Berlin");
City Hamburg = new City("Hamburg");
berlin.country = germany;
hamburg.country = germany;
germany.cities = new HashSet<>(asList(berlin, hamburg));
germany.saveOrUpdate(); // or whichever definition you use

现在在数据库中,您的城市表将具有正确的国家 ID。还建议您在 @OneToMany 关系中使用 mappedBy 属性,因为这是双向关系。使用它,您告诉 JPA 城市是 Country 1-n City 关系的反面。

关于java - 没有第三张表的一对多关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20567641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com