某人的地址可能如下所示:
country: USA
state: Some state
city: N.Y.
Street: some stree name with buildings
Building: number of the building on the street
或者,如果建筑物由几个公寓/房间组成,则应使用另一个实体:
公寓/房间:大楼内的公寓号码
示例中的每个下一级都有父级作为外键,不能为null:
县 - 是州的容器
州 - 是一个城市的容器,所以一个。
建筑 - 可能是也可能不是房间/公寓的容器。
因此,每个级别都有以下表格:
country
id name
1 USA
state
id country_id name
2 1 N.Y.
city
id state_id name
3 2 New York
Street
id city_id name
4 3 Some Street Name
Building
id street_id number
5 4 28
apartment
id building_id number
8 5 36
我遇到的问题是如何将人员映射到此表格结构? 如果某人是一个大家庭住宅,那么他可能住在或不住在公寓里。 理想情况下,我希望收集一些实体:
ManyToMany
Collection<SomeEntity> addresses ...
SomeEntity
可以直接指代公寓或建筑物。
以下是我现在考虑的选项,但我不喜欢它们。
第一个选项SomeEntity
将有一个类型 - 建筑物或公寓,它将如下所示:
SomeEntity
id person_id type address_id
10 11 building 21
11 13 apartment 24
在第一种情况下,address_id指的是建筑物表,在第二种情况下指的是公寓表。
第二个选项是让表格具有以下字段列表:
SomeEntity
id person_id country_id state_id city_id street_id building_id apartment_id
在这种情况下,如果建筑物没有房间,则apartment_id字段为空。此外,如果我需要获取居住在城市/街道上的人员名单,这也很有用,因为我不需要加入所有与地址相关的表格,只需参考SomeEntity表格即可。你觉得这张桌子怎么样?在这种情况下如何映射Person对象? SomeEntity - 只是一个表,而不是对象。我的服务实际上应该不了解内部表结构。这个问题对我来说并不清楚。可能你可以提供更好的解决方案。
请帮助。
答案 0 :(得分:0)
如果类似于我的评论是你的解决方案,那么你问的是如何在hibernate中映射join。 它会是这样的:
@Entity
@Table(name = "TEST_TABLE_A")
public class TestTableA {
public TestTableA(){
}
public TestTableA(String aName){
this.aName = aName;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "A_ID")
private Long id;
@Column(name = "A_NAME")
private String aName;
//some other atribut here
@ManyToMany(cascade = CascadeType.REFRESH)
@JoinTable(name="A_JOIN_B",
joinColumns={@JoinColumn(name="A_ID")},
inverseJoinColumns={@JoinColumn(name="B_ID")})
private Set<TestTableB> testJoins = new HashSet<TestTableB>();
//Getters and setters of all the collumn here
}
您可以假设TEST_TABLE_A是您数据库中的BUILDING表,而TestTableB是您的公寓实体。和A_JOIN_B是您的SOME_ENTITY表,testJoins是您要查找的对象。您必须从建筑物中获取该物体。
如果需要,您可能希望将关系更改为@OneToMany。并更改Cascade.Type
(detail about cascade),以便您更容易维护该表。