JPA 加入基于 1 个公共实体的 2 个实体
JPA join 2 Entity based upon 1 common entity
我有 3 个 tables - Country、Region 和 CountryRegion。
- 国家 - countryId(PK), countryName
- 区域 - regionId(PK), regionName
- CountryRegion - countryId(FK), regionId(FK)
我想在获取区域时获取国家/地区列表。喜欢:
*
{
regionId:11
regionName:"abc"
countries: [
{countryId:"67",
countryName:"us"
},
{...}
]
}
不需要 CountryRegion table 但可以使用遗留数据库。
我已经实现了:
package com.example.demo.model;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "country")
public class Country {
@Id
@Column(name = "countryid")
private int countryId;
@Column(name = "countryname")
private String countryName;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "country")
private List<CountryRegion> regions = new ArrayList<>();
public int getCountryId() {
return countryId;
}
public void setCountryId(int countryId) {
this.countryId = countryId;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public List<CountryRegion> getRegions() {
return regions;
}
public void setRegions(List<CountryRegion> regions) {
this.regions = regions;
}
}
package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "region")
public class Region {
@Id
@Column(name = "regionid")
private int regionId;
@Column(name = "regionname")
private String regionName;
@OneToMany(mappedBy = "region")
private List<CountryRegion> countries = new ArrayList<>();
public int getRegionId() {
return regionId;
}
public void setRegionId(int regionId) {
this.regionId = regionId;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public List<CountryRegion> getCountries() {
return countries;
}
public void setCountries(List<CountryRegion> countries) {
this.countries = countries;
}
}
package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
@Table(name = "countryregion1")
public class CountryRegion implements Serializable {
@Id @ManyToOne
@JoinColumn(name = "regionid", referencedColumnName = "regionId")
private Region region;
@Id @ManyToOne
@JoinColumn(name = "countryid", referencedColumnName = "countryId")
private Country country;
public Region getRegion() {
return this.region;
}
public void setRegion(Region region) {
this.region = null;
}
public Country getCountry() {
return this.country;
}
public void setCountry(Country country) {
this.country = country;
}
}
package com.example.demo.dao;
import com.example.demo.model.Country;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CountryRepository extends CrudRepository<Country, Integer> {
@Override
List<Country> findAll();
}
package com.example.demo.dao;
import com.example.demo.model.Country;
import com.example.demo.model.Region;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RegionRepository extends CrudRepository<Region, Integer> {
@Override
List<Region> findAll();
}
- 控制器和服务公开api以获取数据。
上面的代码有问题,因为我只想获取国家/地区列表(如果是国家/地区,则为地区)
此代码导致 JSON 中的无限循环。已尝试 Json 忽略等,但在那种情况下我没有在列表中获得任何值。
TIA!!
首先你应该明确国家和地区之间的关系。我认为你不需要定义 CountryRegion class.if 关系是 ManyToMany 那么你可以在 Region class 中使用下面的代码:
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "Employee_Project",
joinColumns = { @JoinColumn(name = "regionid") },
inverseJoinColumns = { @JoinColumn(name = "countryid") }
)
Set<Country > countries = new HashSet<>();
如果它是 OneToMany,您在区域 class 中实施的比率就足够了。但我认为你想要符合你愿望的 ManyToMany
我有 3 个 tables - Country、Region 和 CountryRegion。
- 国家 - countryId(PK), countryName
- 区域 - regionId(PK), regionName
- CountryRegion - countryId(FK), regionId(FK)
我想在获取区域时获取国家/地区列表。喜欢:
*
{
regionId:11
regionName:"abc"
countries: [
{countryId:"67",
countryName:"us"
},
{...}
]
}
不需要 CountryRegion table 但可以使用遗留数据库。
我已经实现了:
package com.example.demo.model;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "country")
public class Country {
@Id
@Column(name = "countryid")
private int countryId;
@Column(name = "countryname")
private String countryName;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "country")
private List<CountryRegion> regions = new ArrayList<>();
public int getCountryId() {
return countryId;
}
public void setCountryId(int countryId) {
this.countryId = countryId;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public List<CountryRegion> getRegions() {
return regions;
}
public void setRegions(List<CountryRegion> regions) {
this.regions = regions;
}
}
package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "region")
public class Region {
@Id
@Column(name = "regionid")
private int regionId;
@Column(name = "regionname")
private String regionName;
@OneToMany(mappedBy = "region")
private List<CountryRegion> countries = new ArrayList<>();
public int getRegionId() {
return regionId;
}
public void setRegionId(int regionId) {
this.regionId = regionId;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public List<CountryRegion> getCountries() {
return countries;
}
public void setCountries(List<CountryRegion> countries) {
this.countries = countries;
}
}
package com.example.demo.model;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
@Table(name = "countryregion1")
public class CountryRegion implements Serializable {
@Id @ManyToOne
@JoinColumn(name = "regionid", referencedColumnName = "regionId")
private Region region;
@Id @ManyToOne
@JoinColumn(name = "countryid", referencedColumnName = "countryId")
private Country country;
public Region getRegion() {
return this.region;
}
public void setRegion(Region region) {
this.region = null;
}
public Country getCountry() {
return this.country;
}
public void setCountry(Country country) {
this.country = country;
}
}
package com.example.demo.dao;
import com.example.demo.model.Country;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CountryRepository extends CrudRepository<Country, Integer> {
@Override
List<Country> findAll();
}
package com.example.demo.dao;
import com.example.demo.model.Country;
import com.example.demo.model.Region;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RegionRepository extends CrudRepository<Region, Integer> {
@Override
List<Region> findAll();
}
- 控制器和服务公开api以获取数据。
上面的代码有问题,因为我只想获取国家/地区列表(如果是国家/地区,则为地区)
此代码导致 JSON 中的无限循环。已尝试 Json 忽略等,但在那种情况下我没有在列表中获得任何值。
TIA!!
首先你应该明确国家和地区之间的关系。我认为你不需要定义 CountryRegion class.if 关系是 ManyToMany 那么你可以在 Region class 中使用下面的代码:
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(
name = "Employee_Project",
joinColumns = { @JoinColumn(name = "regionid") },
inverseJoinColumns = { @JoinColumn(name = "countryid") }
)
Set<Country > countries = new HashSet<>();
如果它是 OneToMany,您在区域 class 中实施的比率就足够了。但我认为你想要符合你愿望的 ManyToMany