我有两个实体,即客户关系和订单关系。 一个客户可以有多个订单。 因为我需要这种关系是单向的,所以我使用的是joinTable。
我可以使用JPA向我的客户实体添加条目。 我可以使用JPA向我的订单实体添加条目。
我想知道如何将两者连接在一起数据。 假设我在客户表中有一个条目,在订单表中有两个条目。 我想将order表中的这两个条目与customer表中的一个条目相关联。
目前,我在jointable 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)
我也可以将项目插入奥得河表:
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。
请帮忙。
感谢您的光临。
答案 0 :(得分:1)
这非常简单:
customer.addOrder(order);
这就是你所需要的一切。这是ORM的原则。您操纵对象,ORM使用您定义的映射将它们保存在数据库中。
答案 1 :(得分:1)
您必须将cascade属性添加到@OneToMany批注:
@OneToMany(cascade=CascadeType.ALL)
您可以在此处看到可用于级联的所有类型的操作: http://docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html
在这里,您可以阅读有关cascade属性的更多信息: http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html
您无需明确插入customer_order。