如何使用Spring MVC和Hibernate将对象保存在两个不同的表中

时间:2013-01-27 03:27:15

标签: spring hibernate spring-mvc

让我们考虑以下几点:

@Entity
@Table(name="person")
public class Person implements Serializable {

  @Id
  @GeneratedValue
  @Column(name="id")
  private int id;

  @Column(name="firstName")
  private String firstName;

  @Column(name="lastName")
  private String lastName;

  ...getters/setters...

}

@Entity
@Table(name="car")
public class Car implements Serializable {

  @Id
  @GeneratedValue
  @Column(name="id")
  private int id;

  @Column(name="brand")
  private String brand;

  @Column(name="model")
  private String model;

  @Column(name="personId")
  private String personId;

  ...getters/setters...

}

让我们想象一下,用户将订阅并输入他的个人信息,如名字,姓氏,汽车品牌以及汽车模型。

我不希望此人的个人信息存储在与汽车信息相同的表格中。

我也希望能够使用personId检索汽车信息,这就是我在Car课程中personId的原因。

我应该使用哪些注释来完成此操作?显然我需要对Car表进行约束并使personId成为外键,对吧?什么是最好的方式?

我见过不同的东西,最好的是什么?

2 个答案:

答案 0 :(得分:1)

在Car类中,替换

@Column(name="personId")
private String personId;

@ManytoOne(fetch = FetchType.LAZY)
@CJoinColumn(name="person")
private Person person;

在Person类中,添加

@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
private List<Car> cars;

您现在正在形成双向one-to-many,这意味着您可以检索汽车的人与人(拥有者)的汽车。

级联允许在人员保存时保存或更新汽车。移除此人后,所有汽车也会被删除。

答案 1 :(得分:0)

这取决于您的要求。 如果您想为多个用户使用同一车辆,那么您应该将其作为一个实体,并使用多对多关系。

如果您根本不想更改实体结构,而只想更改数据库映射,请查看@SecondaryTable@SecondaryTables注释,它们为实体定义更多表,然后您将指定每列使用哪个表(否则将它们分配给主表)。