2

私は、適切な単体テストも何もないレガシーシステムで作業しているため、システムで行う変更には非常に注意する必要があります。

私が持っている基本的なシナリオは次のとおりです。私は Address と ManyToOne 関係を持つ Person を取得しました。この関係を変更することはできません。ただし、住所には、請求先住所と郵送先住所などの種類があることを知っておいてください。

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 テーブルに ADDRESS_TYPE というカラムを追加しようと考えているのですが、実装方法に苦労しています。タイプ Address の新しい属性 postalAddress を持ち、getPostalAddress と同じくらい簡単に postalAddress を取得したいだけです。

4

3 に答える 3

0

私の以前のコメントに加えて、Map を使用して Person から Address への 1 対多が必要なように思えます。

提案どおりに address_type 列を追加し、Enum AddressType (POSTAL、BILLING) を作成します。

直接:

//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 があると想定しています。
于 2013-10-15T18:30:15.983 に答える
0

ハスト追加:

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

Personこれにより、リレーションを管理するテーブルに新しい列が追加されます。冗長になるため、テーブルに追加ADDRESS_TYPEする必要はありません。ADDRESS

于 2013-10-15T16:59:20.337 に答える