onetomany 单向与使用 jpa 的可连接设置

Posted

技术标签:

【中文标题】onetomany 单向与使用 jpa 的可连接设置【英文标题】:onetomany unidirectional with jointable setup using jpa 【发布时间】:2013-03-12 23:34:35 【问题描述】:

我有两个实体,即客户和订单处于一对多关系中。 一个客户可以有多个订单。 由于我需要这种关系是单向的,所以我使用的是 joinTable。

我可以使用 JPA 向我的客户实体添加条目。 我可以使用 JPA 向我的订单实体添加条目。

我想知道如何将这两个数据连接在一起。 假设我在客户表中有一个条目,在订单表中有两个条目。 我想将订单表中的这两个条目关联到客户表中的一个条目。

目前,我在可连接的 customer_order 中没有看到任何条目。我如何建立协会?我想当我将订单添加到订单表中时,我将不得不以某种方式提及客户 ID 号。不知道该怎么做。 JPA 中是否有条件查询?

谢谢。

客户类 -

@Entity
public class Customer implements Serializable 
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "generatorCustomer")
    @TableGenerator(name = "generatorCustomer", allocationSize = 1)
    @Column(name="customer_id")
    private Long id;
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    @OneToMany()
    @JoinTable (
        name="customer_order",
        joinColumns= @JoinColumn(name="customer_id", referencedColumnName="customer_id") ,
        inverseJoinColumns= @JoinColumn(name="order_id", referencedColumnName="order_id", unique=true) 
    )
    private List<Order> orderList = new ArrayList<Order>();
    public List<Order> getOrderList() 
        if(this.orderList == null) 
            this.orderList = new ArrayList<Order>();
        
        return this.orderList;
    

    public void setOrderList(List<Order> orderList) 
        this.orderList = orderList;
    

    public void addOrder(Order order) 
        this.orderList.add(order);
    

    /* other logic follows......... */

订单类 -

@Entity
public class Order implements Serializable 
@Id
@GeneratedValue
@Column(name="order_id")
private Long id;
public Long getId() 
    return id;


public void setId(Long id) 
    this.id = id;


/* other logic follows......... */

客户表说明:

jbossql=# \d customer
Column   |         Type          |                        Modifiers
-------------+-----------------------+---------------------------------------------------------------
customer_id | bigint                | not null default nextval('customer_customer_id_seq'::regclass)
name        | character varying(50) | 
Indexes:
"customer_pkey" PRIMARY KEY, btree (customer_id)
Referenced by:
TABLE "customer_order" CONSTRAINT "fk8ef2f420ec016855" FOREIGN KEY (customer_id) REFERENCES customer(customer_id)

订单表说明:

jbossql=# \d order
Column   |  Type  | Modifiers 
------------+--------+-----------
order_id   | bigint | not null
value      | real   | 
Indexes:
"order_pkey" PRIMARY KEY, btree (order_id)
Referenced by:
TABLE "customer_order" CONSTRAINT "fk1e4828a98187660" FOREIGN KEY (order_id) REFERENCES order(order_id)

customer_order 联表说明:

jbossql=# \d customer_order
Column       |  Type  | Modifiers 
--------------+--------+-----------
customer_id  | bigint | not null
order_id     | bigint | not null
Indexes:
"customer_order_order_id_key" UNIQUE CONSTRAINT, btree (order_id)
Foreign-key constraints:
"fk1e4828a98187660" FOREIGN KEY (order_id) REFERENCES order(order_id)
"fk1e4828adba386b8" FOREIGN KEY (customer_id) REFERENCES customer(customer_id)

我可以在客户表中插入一个项目:

jbossql=# select * from customer;
customer_id | name 
-------------+-------------
1        | joe
(1 row)

我也可以将项目插入到 oder 表中:

jbossql=# select * from order;
order_id | value 
----------+-----------
1       |  1.8
2       |  0.5
(2 rows)

我在想 customer_order 表会自动填充,即 hibernate 会接受它。但似乎不是因为我的关节是空的:

jbossql=# select * from customer_order;
customer_id | order_id 
-------------+-----------
(0 rows)

所以,我的意图是让这两个订单条目与客户 joe 相关联。

请帮忙。

    我是否必须明确地向 customer_order 表中添加一条记录? 如果没有,我如何将项目插入订单表,以便我可以将该条目连接到特定客户? 我的映射是否在 java 文件中以使此 OneToMany [单向] 关系按预期工作 我正在使用 JPA2、JBoss 和 Hibernate。您是否有任何代码引用来测试一对多关系?完整项目或阅读材料的任何参考资料都会有所帮助。

感谢收看。

【问题讨论】:

你能告诉我们你的映射吗? @overmeulen 您好,添加了所有可能帮助您帮助我的相关信息。再次感谢。 【参考方案1】:

非常简单:

customer.addOrder(order);

这就是你所需要的。这就是 ORM 的原理。您操作对象,ORM 使用您定义的映射将它们保存在数据库中。

【讨论】:

谢谢。我直接将记录添加到订单对象实例。在记录给客户的同时,我的订单参数有空数据 - 我的情况是我必须先创建客户,然后在将来的某个时间向该客户添加订单记录。因此我的客户类构造函数没有考虑订单对象。我还想说我必须在 Customer 类中使用的 OneToMany 注释上使用 CascadeType.ALL。再次感谢您的提示。【参考方案2】:

您必须将级联属性添加到@OneToMany 注释: @OneToMany(cascade=CascadeType.ALL)

您可以在此处查看可用于级联的所有类型的操作: http://docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html

您可以在此处阅读有关级联属性的更多信息: http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html

您无需显式插入 customer_order。

【讨论】:

以上是关于onetomany 单向与使用 jpa 的可连接设置的主要内容,如果未能解决你的问题,请参考以下文章

JPA与同一实体的两个单向@OneToMany关系导致重复输入

如何在 JPA 中定义单向 OneToMany 关系

单向 OneToMany JPA 仅向我显示第一个相关对象“n”次

java JPA中的单向OneToMany关系

JPA 单向一对多关联关系

spring jpa ManyToMany 理解和使用