0

一个人的地址可能如下所示:

country: USA
state: Some state
city: N.Y.
Street: some stree name with buildings
Building: number of the building on the street

或者,如果建筑物由多个公寓/房间组成,则应使用另一个实体:

公寓/房间:建筑物中的公寓数量

示例中的每个下一级都将父级作为不能为空的外键:

县 - 是状态的容器

state - 是城市的容器等等。

建筑物 - 可能是也可能不是房间/公寓的容器。

结果,我为每个级别提供了下表:

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 ...

whereSomeEntity可以直接指公寓或建筑物。

这是我现在正在考虑的选项,但我不喜欢它们。

第一个选项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 - 只是一个表,而不是对象。我的服务实际上不应该对内部表结构一无所知。这个问题我不清楚。也许您可以提供更好的解决方案。

请帮忙。

4

1 回答 1

0

如果与我的评论类似的内容是您的解决方案,那么您要问的是如何映射加入休眠状态。它会是这样的:

@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 (有关级联的详细信息),以便您更轻松地维护该表。

于 2013-07-21T22:14:49.190 回答