2013-10-15 3 views
2

Я работаю над устаревшей системой, которая не имеет надлежащего модульного теста, ни один из них, поэтому мне нужно быть очень осторожным в отношении любых изменений, которые я делаю в системе ,Hibernate: сопоставление одного столбца для двух разных классов

Базовый сценарий, который у меня есть: У меня есть человек, у которого есть отношения ManyToOne с адресом, я не могу изменить эти отношения. Но знаете, существуют типы адресов, например: адрес выставления счетов и почтовый адрес.

public class Person { 

@Id 
@Column(name = "PERSON_ID") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer id; 

@Column(name = "PERSON_NAME") 
private String personName; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ADDRESS_ID") 
private Address address; 

getters and setters 

адрес класса

public class Address { 

private static final long serialVersionUID = 1L; 

@Id 
@Column(name = "ADDRESS_ID") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "STREET_1_NAME") 
private String street1Name; 

@Column(name = "STREET_2_NAME") 
private String street2Name; 

getters and setters 

Я имею в виду, чтобы добавить ADDRESS_TYPE столбца адресную таблицу, но я изо всех сил о том, как осуществить это. Я просто хочу иметь новый атрибут postalAddress типа Address и получить postalAddress так же просто, как просто getPostalAddress.

+0

Просто уточнить: отношения являются много-к-одному от человека для обращения? У каждого человека есть один адрес, и каждый адрес может принадлежать многим людям. Это верно? С вашего вопроса звучит так, будто вы хотите, чтобы все было наоборот. У каждого человека есть несколько адресов: биллинг, почтовый и т. Д. –

+0

Да, ваше право, это то, что у меня есть и чего я хочу. – Sergio1978

ответ

2

Спасибо Алан, ваше предложение помогло, но я в конечном итоге использовал InheritanceType из-за совместимости с устаревшим кодом.

Мой адрес класса теперь выглядит следующим образом:

@Entity 
@Table(name = "ADDRESS") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="ADDRESS_TYPE", 
    discriminatorType=DiscriminatorType.INTEGER 
) 
@DiscriminatorValue("null") 

public class Address { 

Мой PostalAddress выглядит следующим образом:

@Entity 
@Table(name = "ADDRESS") 
@DiscriminatorValue(value="2") 
public class PostalAddress extends Address { 

    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    @JoinColumn(name = "INSURED_ID") 
    private Insured insured; 

    public void setInsured(Insured insured) { 
     this.insured = insured; 
    } 

    public Insured getInsured() { 
     return insured; 
    } 

} 

Так, эти адреса вставляются в прошлом без типа Я принимаю null и совместимость новые будут также «нулевыми», только PostalAddress будет «2».

И мой класс Person выглядит

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ADDRESS_ID") 
private Address address; 

@Transient 
private PostalAddress postalAddress; 

Я знаю, это звучит странно, но я попросил, чтобы иметь отношения человека 1 - N PostalAddress.

0

Хуст добавить:

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "POSTAL_ADDRESS_ID") 
private Address postalAddress; 

это добавит новый столбец в таблице Person управления соотношением. Не нужно добавлять ADDRESS_TYPE в ADDRESS стол, так как он будет излишним.

0

В дополнение к моему предыдущему комментарию звучит для меня так, как будто вы хотите, чтобы один-ко-многим из Лица обращался с помощью Карты.

Добавьте столбец address_type, как вы предложили и создать Enum AddressType (ПОЧТОВЫЙ, биллинг):

В Person:

//there are various MapKey annotations however, without testing I think these are what you need 
@OneToMany 
@MapKeyEnumerated(EnumType.String) //tells Hibernate we want the type to contain BILLING/POSTAL etc rather than the ENUM ordinals (0,1 etc) 
@MapKeyColumn(name ="address_type") 
private Map<AddressType, Address) addresses; 

public Address getPostalAddress(){ 
return addresses.get(AddressType.POSTAL); 
} 

public Address getBillingAddress(){ 
return addresses.get(AddressType.Billing); 
} 

//or even 
public Address getAddress(AddressType type){ 
return addresses.get(type); 
} 
  • Я предполагаю, что таблица адресов имеет FK лицо ,
Смежные вопросы