Лицо для адресации картографирования JPA

Адрес лица может выглядеть следующим образом:

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

Или в качестве альтернативы, если здание состоит из нескольких квартир/комнат, необходимо использовать другое лицо:

Квартиры/комнаты: номер квартиры в здании

каждый следующий уровень в примере имеет родительский как ключ для новичков, который не может иметь значение null:

county - это контейнер состояний

государство - это контейнер городов и так один.

здание - может быть или не быть контейнером комнат/квартир.

В результате у меня есть следующие таблицы для каждого уровня:

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 будет иметь тип - либо здание, либо квартиру, и это будет выглядеть так:

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 равно null. Также полезно, если мне нужно, например, получить список людей, которые живут в городе/на улице, потому что мне не нужно присоединяться ко всем адресам, связанным с таблицами, просто обратитесь к таблице SomeEntity. Что вы думаете об этой таблице? Как сопоставить объект Person в этом случае? SomeEntity - это просто таблица, а не объект. Мои службы фактически ничего не должны знать о структуре внутренних таблиц. Этот вопрос мне непонятен. Вероятно, вы можете предложить лучшее решение.

Пожалуйста помоги.

1 ответ

если что-то похожее на мой комментарий - ваше решение, то то, что вы спросили, как сопоставить объединение в спящем режиме. это будет примерно так:

@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
}
</testtableb></testtableb>

вы можете предположить, что TEST_TABLE_A - ваша таблица BUILDING в вашей базе данных, а TestTableB - ваша квартира. и A_JOIN_B - ваша таблица SOME_ENTITY, а testJoins - объект, который вы ищете. Вы должны получить этот объект из здания.

Вы можете изменить отношение к @OneToMany, если хотите. и измените Cascade.Type (подробно о каскаде), чтобы вам было легче поддерживать эту таблицу.

licensed under cc by-sa 3.0 with attribution.