【问题标题】:Does a OneToOne and OneToMany need to be mapped on both sides in Hibernate?在 Hibernate 中是否需要在两侧映射 OneToOne 和 OneToMany?
【发布时间】:2014-07-09 18:25:13
【问题描述】:

如果我有一个简单的Person 类:

public class Person {
    @OneToOne
    private Address address;

    @OneToMany
    private List<Car> cars;
}

AddressCar 是否需要有一个 Person 字段?大多数教程都以这种方式显示,即存在双向通信。

但在我的情况下,我只需要一个人中的地址和汽车,而不需要地址或汽车中的人。

你会如何在 Hibernate 中映射它?谁应该为mappedBy负责?

【问题讨论】:

  • @Amogh 好的;但是如果我在Car 中没有Person 并且我想让CAR 表有FK 到PERSON,那么Hibernate 会解决吗?也许你可以写一个例子来说明你的意思?
  • 对不起我的第一个评论。在OneToMany你必须把Person留在车里,那么只有你可以实现一个personId有很多carIds。
  • @Amogh 不,你没有。虽然您必须在 CAR 表中有一个连接列,但 Car 实体可能完全不知道它的所有者。看看JoinColumn 注释。您可以在 Person 类中使用它来实现它。
  • @kostja,作为答案添加的示例。

标签: java hibernate jpa persistence


【解决方案1】:

单向@OneToOne 主键关联:

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

@Id  
@Column(name="person_id") 
@GeneratedValue     
private Integer personId;  

private String name;  

@OneToOne(cascade=CascadeType.ALL)  
@PrimaryKeyJoinColumn 
private address address;

//getters & setters

}  

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

@Id  
@Column(name="address_id")    
private Integer addressId;  

private String street;  

//getters & setters

} 

单向@OneToMany 主键关联:

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

@Id  
@Column(name="person_id") 
@GeneratedValue     
private Integer personId;  

private String name;  

@OneToOne(cascade=CascadeType.ALL)  
@PrimaryKeyJoinColumn 
private address address;

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "person_id")
private List<car> cars;


//getters & setters

}  

更新

您应该很清楚,一个实体如何在一列中保留这么多 ID?

始终记住,多方将有单个对象作为敌键,而一方将有列表来保存子对象。

所以你有两个选择: 1)使用一个特定的表来存储你的一个和多个实体之间的关系。像这样的:

@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "person_id")
private List<car> cars;

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch07.html#collections-mapping

2) 你也可以说很多车属于一个人,所以在汽车类中我们也这样写:

@ManyToOne
private person person;

http://deepeshdarshan.wordpress.com/2012/11/29/hibernate-many-to-one-unidirectional-mapping-using-annotation/

此信息用于一对多和多对一的单向映射。

【讨论】:

  • 我正在通过我的手机发布答案,因此您可能会发现一些语法 msitake。所以如果有任何差异,请随时询问。
  • 谢谢你;那么带有外键的额外列将始终位于AddressCar 表或Person 表中?
  • @Queequeg,在OneToOne 中,任何表中都不会有额外的外键列。在OneToMany 的情况下,在我们的情况下car 的多方将具有外键。答案已更新,并附有适当的解释。
  • @Queequeg,单向映射或双向映射由您决定。视需要而定。如果您只想要 person 需要知道哪个 addressId 和 carId 是我的,那么单向(正如我们所做的那样)就可以了。但是如果你想car也想知道我属于哪个人,那么你必须在人侧做OneToMany,在车侧做ManyToOne,这是双向的
  • @Amogh 感谢您的 cmets;关于您在编辑中提到的两个选项:在 2)我假设没有 Person 成员就不可能指定 JoinColumn?并且在 1) 中,CAR JoinTable 不会与实体的 CAR 表发生冲突吗?其次,为什么只指定1个@JoinColumn?您不需要 2 - 一个用于个人 ID,第二个用于汽车 ID?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2010-09-23
  • 2015-02-13
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多