让我们假设应该从头开始构建的应用程序的域模型描述如下:
一个人可能住在一个地址。一个人可以拥有多辆汽车。
如果我必须先设计数据库,我可能会想出以下数据库设计(规范化,级联等不应该对我的具体问题起主要作用)。
Person (id, name)
Address (id, street, zip, city, person_id)
Car (id, manufacturer, yearBuilt, color, person_id)
我主要遵循标准设计概念(例如在此链接http://db.grussell.org/section006.html中描述)。
正如您所看到的,地址表具有person表的外键,因为person - address关系可以被视为可选。
一个人可以拥有多辆汽车的事实是通过将外键放入汽车牌桌中的人来实现的。我认为这是建立1..m关系的标准方法。
如果我必须先设计域模型,我可能会想出以下设计:
public class Person {
private String name;
private Address address;
private List<Car> cars;
// Getters and setters
}
public class Address {
private String street;
private String zip;
private String city;
// Getters and setters
}
public class Car {
private String color;
private Date yearBuilt;
// Getters and setters
}
在该域模型中,Person
类具有所有必要的关系。 Address
和Car
课程不需要了解他们拥有Person
的任何内容。
我现在可以通过添加@Entity
并为每个类提供@Id
属性将这些类转换为JPA实体。
@Entity
public class Person implements Serializable {
@Id
private Long id;
private String name;
@OneToOne
private Address address;
@OneToMany
private List<Car> cars;
public Person() { }
// Getters and setters
}
@Entity
class Address implements Serializable {
@Id
private Long id;
private String street;
private String zip;
private String city;
public Address() { }
// Getters and setters
}
@Entity
class Car implements Serializable {
@Id
private Long id;
private String color;
private Date yearBuilt;
public Car() { }
// Getters and setters
}
如果我的JPA提供程序根据提供的注释创建表,则会创建以下数据库结构:
Person (id, name, address_id)
Address (id, street, zip, city)
Car (id, manufacturer, yearBuilt, color)
Person_Car (person_id, car_id)
正如您所看到的,如果我必须首先设计数据库,那么这与我创建的数据库结构不对应。我在JPA提供者创建的数据库模型中看到了一些缺陷:
我现在可以做的是为JPA实体类提供额外的字段和/或注释,以争取人们可能期望的数据库结构。
是否有必要争取能够创建预期数据库结构的域模型/ JPA实体设计(就像使用数据库优先方法一样)?如果是这样,是否可以使用与直接创建的域模型不同的域模型?设计领域模型/ JPA实体模型有哪些优势,可以创建某种最佳实践&#34;数据库结构?
答案 0 :(得分:0)
将人员映射更新为Car,如下所示:
@OneToMany
@JoinColumn(name = "person_id")
private List<Car> cars;
然后,JPA提供程序的DDL生成器应该创建所需的表结构。