在 SQL 模式中具有下一个表结构:客户、员工、订单。 相应地,Java 代码中的 3 个实体类:Client、Employee、Order。
来自客户和员工的两个主 ID 字段都作为外键位于订单表中。
问题是java代码中应该如何显示? 据我了解,应该像将 Set 字段添加到用 @OneToMany 注释的 Clients 和Employees 一样完成。
但是应该在 Order Entity 中做什么,也许我必须添加除 @OneToMany 之外的任何其他注释?
最佳答案
我认为您对 Hibernate 的关系映射有一些误解。
如果实际上您的订单表有客户和员工的外键,那么您正在寻找的注释是@ManyToOne
当您的实体具有被目标实体引用的多条记录时,使用 @OneToMany 注释,而当您的实体只有一条引用目标实体的记录时,使用 @ManyToOne。
例如:
订单实体具有来自客户实体的一项引用和来自员工实体的一项引用。
在这种情况下,Orders 实体可以通过以下方式映射:
@Entity
@Table(name = "Orders")
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Client client;
@ManyToOne
private Employee employee;
//getters and setters
}
@Entity
@Table(name = "Clients")
public class Client implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String attribute1;
//getters and setters
}
@Entity
@Table(name = "Employees")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String attribute1;
//getters and setters
}
通过上面给出的示例,您应该能够使您的模式与 Hibernate 一起正常工作,但为了理解,让我们想象一个场景,您需要从客户端获取所有订单,当然您可以这样做它的查询仅选择 Client 表中的 Orders,但是 Hibernate 提供了 @OneToMany 注释,这将使您能够访问 Client 中的所有 Orders,而无需单独的查询,只需通过映射即可!让我们看一个例子:
@Entity
@Table(name = "Orders")
public class Order implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Client client;
//getters and setters
}
@Entity
@Table(name = "Clients")
public class Client implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String attribute1;
@OneToMany(mappedBy = "client")
private List<Order> orders;
//getters and setters
}
在此示例中,您应该能够通过调用“orders”属性的 get 来获取来自客户端的所有订单。请注意,在 @OneToMany 映射上,我们已将“mappedBy”属性指定为“client”,这是需要的,因为我们在 Client 和 Order 之间有双向映射,在 @OneToMany 的简单用法中,您不需要此映射。
重要提示:使用 @OneToMany 映射时,您最终会遇到一些延迟获取问题,在这种情况下,我强烈建议您看一下这个问题:
Solve “failed to lazily initialize a collection of role” exception
此外,我认为您应该开始阅读更多有关 Hibernate 的内容,以了解其基本概念,请检查有关 Hibernate 上的 @OneToMany 和 @ManyToOne 注释的其他问题:
关于java - hibernate 。一张表中有多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520974/