Отображение Hibernate - Соединение двух таблиц с таблицей ассоциации - Но с изюминкой

1

У меня есть следующие лица... Customer, Card и Address

Клиент:

 {
     private String cust_id; // Primary key
     .....

     @OneToOne
     Address address; // I want to load address of the customer. 
                      // Can change the association to @OneToMany, if needed
 }

Карта:

 {
    private String card_id; // Primary Key
    private String cust_id; // Foreign Key to Customer.cust_id
    ....
 }

Адрес:

 {
    private String card_id; // Foreign key to card.card_id
    private String address1;
    .....
 }

Когда я загружаю клиентов, я хочу загрузить Адреса с Card ассоциации. Но сложная часть - Address не имеет первичного ключа. У этого есть только внешний ключ.

  • 0
    Вы смотрели на поддержку Hibernate для составных ключей ? К сожалению, примером является XML / HBM, и кажется, что вы используете аннотации, но его должно быть довольно легко адаптировать.
  • 0
    Я ищу пример с аннотацией. Позволь мне проверить.
Показать ещё 1 комментарий
Теги:
hibernate
mapping
entity

2 ответа

2

Вы можете использовать аннотацию @JoinTable после @OneToOne, чтобы указать карточный стол, поэтому вам не понадобится сущность для карты, но если таблица карт - это не просто реляционная таблица, вы можете сопоставить карту в User как @OneToOne и используйте метод @Transient getAddress(), который возвращает 'this.card.getAddress()', но на объекте карты вы должны сопоставить отношение между адресом и картой (@OneToOne (mappedBy = 'card_id')) и в Адрес, вы можете отобразить card_id как @Id.

Первая альтернатива

Клиент:

@OneToOne
@JoinTable(name="card", joinColumns = @JoinColumn(name="cust_id"),
inverseJoinColumns = @JoinColumn(name="card_id"))
private Address address;

Вторая альтернатива

Клиент:

@OneToOne(mappedBy="cust_id")
private Card card;

...
@Transient
public Address getAddress(){
 return this.card == null ? null : this.card.getAddress();
}

Карта:

@OneToOne(mappedBy="card_id")
private Address address;

Адрес:

@Id
private String card_id;

Во втором случае карта имеет встроенный pk, который образован двумя fks (Customer and Address)

Карта:

@EmbeddedId
private CustomerAddressPK id;

CustomerAddressPK

@Embeddable
public class CustomerAddressPK(){

  private String cust_id;
  private String card_id;
}
  • 0
    Первый пример работает? В настоящее время это то, что у меня есть. Но я не уверен, что это работает. Потому что у карты нет первичного ключа. У него есть внешний ключ.
  • 0
    В первом примере карточке не нужен pk, потому что это просто реляционная таблица, идентификатор card_id должен называться address_id, потому что он действительно представляет адрес, а не саму карточку.
Показать ещё 5 комментариев
1

Отображение между Customer и Address может быть выполнено с использованием концепции зависимых объектов.

Посмотрите на документацию, вы найдете аналогичный пример, где есть сопоставление между объектом Person с зависимым объектом с именем Name.

  • 0
    Это не сокращает это. Это как одна таблица, разделенная на две части. Например, поля Customer и Address находятся в одной таблице, но с разными объектами, если я правильно понял. Можете ли вы показать пример, если это решение?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню