【问题标题】:Unidirectional Relationship in Entity-Bean (JPA)Entity-Bean (JPA) 中的单向关系
【发布时间】:2010-08-18 19:10:54
【问题描述】:

如何在 EJB 3.0 Entity-Beans (JPA) 中建立单向关系?

例如,客户知道订单,但订单对客户没有任何方法。 使用(@OneToMany 或 @OneToOne 或 @ManyToMany)

问候

【问题讨论】:

    标签: java orm jpa


    【解决方案1】:

    以下是使用 JPA 2.0 建立单向 @OneToMany 关系的方法:

    @Entity
    public class Customer {
      @Id
      @Column(name="cust_id")
      private long id;
      ...
      @OneToMany
      @JoinColumn(name="owner_id", referencedColumnName="cust_id")
      private List<Order> order;
      ...
    }
    
    @Entity
    public class Order {
        @Id
        @Column(name="order_id")
        private long id;
        ...
    }
    

    关系数据库:

    客户:

    +---------+---------+------+-----+---------+-------+
    | Field   | Type    | Null | Key | Default | Extra |
    +---------+---------+------+-----+---------+-------+
    | cust_id | int(11) | NO   | PRI | NULL    |       |
    +---------+---------+------+-----+---------+-------+
    

    订单:

    +----------+---------+------+-----+---------+-------+
    | Field    | Type    | Null | Key | Default | Extra |
    +----------+---------+------+-----+---------+-------+
    | order_id | int(11) | NO   | PRI | NULL    |       |
    | owner_id | int(11) | NO   | MUL | NULL    |       |
    +----------+---------+------+-----+---------+-------+
    

    【讨论】:

    • 请注意,JPA 1.0支持单向OneToMany 关系没有JoinTable。换句话说,您不能将上述表格模型映射到单向 OneToMany,因此它不能准确地说明您的答案。
    • @JoinColumn(name="cust_id", referencedColumnName="owner_id") 对吗?
    【解决方案2】:

    暂时将“单向”放在一边,我们可以对客户-订单关系建模如下。

    @Entity
    public class Customer {
      // ...
      @Id @GeneratedValue
      int id;
      @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
      Set<Order> orders;
      // ...
    }
    
    @Entity
    public class Order {
      // ...
      @ManyToOne(optional = false)
      Customer customer;
      // ...
    }
    

    这里我假设每个订单只有一个客户。在数据库中,Order 表将有一个“customer_id”列,其中包含指向 Customer 表的“id”列的外键。 DDL 如下所示。

    CREATE TABLE Customer (
      id INT NOT NULL,
      ...
      PRIMARY KEY (id)
    );
    
    CREATE TABLE Order (
      ...
      customer_id INT NOT NULL,
      ...
      FOREIGN KEY (customer_id) REFERENCES Customer (id)
    );
    

    虽然 Customer 类包含一个订单集合,但这实际上不会以任何方式影响数据库结构;这只是检索/管理属于客户的订单的一种便捷方式。例如,您可以完全从 Customer 中删除“orders”成员,而是依靠查询来获取这些记录。

    我想说的是,从 数据库 的角度来看,确实不存在“单向”关系。提供的示例 reverendgreen 将生成 Java 类,其中没有 直接 方法从 Order 对象获取 Customer 对象,但生成的数据库结构将相同(忽略细微差别在列名中)。您始终可以通过查询找到给定订单的客户。

    【讨论】:

    • 正如我在评论中所写,生成的数据库结构不会与 JPA 1.0 相同,JPA 1.0 需要 JoinTable 来表示单向 OneToMany
    • 阅读您的回答后,我更新了我正在处理的项目中的一些实体,以使用您在示例中提到的标记。它运行得很好——数据库结构相同,子类不包含对父类的直接引用。我不需要 @JoinTable 注释。依赖如下:hibernate-annotations 3.4.0.GA、hibernate-commons-annotations 3.1.0.GA、hibernate-core 3.3.2.GA、hibernate-entitymanager 3.4.0.GA、persistence-api 1.0。这只是 Hibernate 超越 JPA 1.0 规范的一个例子吗?
    • 是的,确切地说,这是特定于 Hibernate 的,在 标准 JPA 1.0 中的 OneToOne 上不允许使用 JoinColumn。我在@OneToMany without inverse relationship and without a join table? 中提供了相关参考资料
    猜你喜欢
    • 2013-05-04
    • 2016-09-08
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2014-05-02
    相关资源
    最近更新 更多