举例:Customer和Order之间。多个Order对应一个Customer就可以理解为单向多对一的关联关系。
order.java (JAP中通过直接省去了对应的映射数据表的配置文件,使用@Entity @Table注解代替)
@Table(name="JPA_ORDER") @Entity public class Order { private Integer id; private String orderName; private Customer customer; @GeneratedValue @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="ORDER_NAME") public String getOrderName() { return orderName; } public void setOrderName(String orderName) { this.orderName = orderName; } /** * 映射单向多对一的关联关系 * @ManyToOne:映射多的一方 * @JoinColumn:映射外键,name属性指定外键的名称。 */ @JoinColumn(name="CUSTOMER_ID") @ManyToOne(fetch=FetchType.LAZY) public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } } /** * 保存多对一时,建议先保存一的一端,再保存多的一端,避免额外的 * 更新语句(因为单向多对一时,在JP规范中,要求多的一方维护关联关系 * ,所以如果先insertOrder,那么因为关联的Customer还没有生成id,所以 * 先为null,等之后insertCustomer后,在update之前的关联关系。·) */ @Test public void testManyToOnePersist() { Customer customer = new Customer(); customer.setAge(16); customer.setBrith(new Date()); customer.setCreatTime(new Date()); customer.setEmail("pp@com"); customer.setLastName("pp"); Order order1 = new Order(); order1.setOrderName("O-PP-1"); Order order2 = new Order(); order2.setOrderName("O-PP-2"); //设置关联关系 order1.setCustomer(customer); order2.setCustomer(customer); entityManager.persist(customer); entityManager.persist(order1); entityManager.persist(order2); } /** * 默认情况下, 使用左外连接的方式来获取 n 的一端的对象和其关联的 1 的一端的对象. * 可使用 @ManyToOne 的 fetch 属性来修改默认的关联属性的加载策略 */ @Test public void testManyToOneFind(){ Order order = entityManager.find(Order.class, 95); System.out.println(order.getOrderName()); String lastName = order.getCustomer().getLastName(); System.out.println(lastName); }