开发者

Joining tables with composite keys in a legacy system in hibernate

开发者 https://www.devze.com 2022-12-29 12:45 出处:网络
I\'m currently trying to create a pair of Hibernate annotated classes to load (read only) from a pair of tables in a legacy system. The legacy system uses a consistent (if somewhat dated) approach to

I'm currently trying to create a pair of Hibernate annotated classes to load (read only) from a pair of tables in a legacy system. The legacy system uses a consistent (if somewhat dated) approach to keying tables. The tables I'm attempting to map are as follows:

Customer                     CustomerAddress
--------------------------   ----------------------------
customerNumber:string (pk)   customerNumber:string (pk_1)
name:string                开发者_JAVA百科  sequenceNumber:int    (pk_2)
                             street:string
                             postalCode:string

I've approached this by creating a CustomerAddress class like this:

@Entity
@Table(name="CustomerAddress")
@IdClass(CustomerAddressKey.class)
public class CustomerAddress {

  @Id
  @AttributeOverrides({
    @AttributeOverride(name = "customerNumber", column = @Column(name="customerNumber")), 
    @AttributeOverride(name = "sequenceNumber", column = @Column(name="sequenceNumber"))
  })

  private   String       customerNumber;

  private   int          sequenceNumber;

  private   String       name;

  private   String       postalCode;
  ...
}

Where the CustomerAddressKey class is a simple Serializable object with the two key fields. The Customer object is then defined as:

@Entity
@Table(name = "Customer")
public class Customer {

  private String customerNumber;

  private List<CustomerAddress> addresses = new ArrayList<CustomerAddress>();

  private String name;

  ...
}

So, my question is: how do I express the OneToMany relationship on the Customer table?


I may have an answer for my own question. Add the following to Customer:

@OneToMany(mappedBy="customer")
@JoinColumn(name="customerNumber")
List<CustomerAddress> addresses = new ArrayList<CustomerAddress>();

And the following to CustomerAddress:

@ManyToOne
@JoinColumn(name="customerNumber")
protected Customer customer;

This turns out to be a simpler problem to solve than I first thought. Typical.


I assume you have read the Bauer/King Hibernate book, which is extremely bad at explaining how do implement composite primary keys correctly. Don't let yourself be fooled by a bad book: composite primary key are not a property of legacy systems...

0

精彩评论

暂无评论...
验证码 换一张
取 消