java - hibernate 。一张表中有多个外键

标签 java sql hibernate foreign-keys

在 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 注释的其他问题:

Hibernate/JPA ManyToOne vs OneToMany

关于java - hibernate 。一张表中有多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520974/

相关文章:

java - 在 session 期间更改 Hibernate Session.FlushMode

java - Java程序的内存区域?

mysql - 在sql结果中排序

sql - 查询 oracle clob 列

mysql - 用户在mysql组中的最后n个事务

mysql select distinct 语句(严格版本?)

hibernate - Grails org.h2.jdbc.JdbcSQLException 列的值太长

java - 在我的构造函数中使用字符串数据类型时出现问题,应用程序文件无法正常运行

java - "Exception in thread "主 "java.lang.IndexOutOfBoundsException: Index: 0, Size: 0"与 ArrayList?

java - Runtime.exec(cmd) 的用户