解决JPA映射的人

时间:2013-07-21 15:47:37

标签: java hibernate database-design jpa orm

某人的地址可能如下所示:

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 - 只是一个表,而不是对象。我的服务实际上应该不了解内部表结构。这个问题对我来说并不清楚。可能你可以提供更好的解决方案。

请帮助。

1 个答案:

答案 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),以便您更容易维护该表。