Hibernate OneToOne双向映射,只有一个属性是一个实体



假设我有两个实体- Person和Car。

我知道我可以这样做双向映射:

@Entity
public class Person implements Serializable {
    @Id Integer id;
    @OneToOne
    @JoinColumn(name = "car_id")
    Car car;
}
@Entity
public class Car implements Serializable {
    @Id Integer id;
    @OneToOne(mappedBy = "car")
    Person person;
} 

受到这个答案的启发。

但是我不想在Car实体中存储整个Person实体。我想让Car看起来像这样:

@Entity
public class Car implements Serializable {
    @Id Integer id;
    Integer person_id;
} 

,仍然有两个实体之间的双向映射。有办法做到这一点吗?

首先,请注意,当您将一个实体与另一个实体相关联时,那么在数据库中,只有相关实体的id属性作为外键存储在表中[在ManyToOne的情况下是同一个表,在ManyToMany的情况下是JoinTable]。所以,从数据库的角度来看,它是优化的[没有额外的开销,除了外键]。

现在从Java OOP的角度来看,你的一个实体包含其他实体作为一个字段。这在实际应用中非常有用。然而,如果你不想在所有情况下都需要其他相关的实体,那么你可以使用JPA提供的延迟加载功能[默认获取类型是lazy]。意思是,当你从数据库中获取一个对象时,它对关联的其他对象有空值并且在你实际使用那个对象时被初始化。

在您的示例中,Person是拥有实体,Car是拥有实体,并且In数据库Person表将Car id作为外键。而Car只有id列,没有person id作为外键。

最新更新