persistence.xml 里面加句 可以自动生成表
<property name="hibernate.hbm2ddl.auto" value="update" />
Orders .java
package com.launch.jpa;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Date;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "Orders")
public class Orders implements Serializable {
private static final long serialVersionUID = 4970325922198249712L;
private Integer orderid;
private Float amount;
private Set<OrderItems> orderItems = new HashSet<OrderItems>();
private Date createdate;
@Id
@GeneratedValue
public Integer getOrderid() {
return orderid;
}
public void setOrderid(Integer orderid) {
this.orderid = orderid;
}
public Float getAmount() {
return amount;
}
public void setAmount(Float amount) {
this.amount = amount;
}
//对应orderitems getOrder 而不是 orders
@OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@OrderBy(value = "id ASC")
public Set<OrderItems> getOrderItems() {
return orderItems;
}
public void setOrderItems(Set<OrderItems> orderItems) {
this.orderItems = orderItems;
}
@Temporal(value=TemporalType.TIMESTAMP)
public Date getCreatedate() {
return createdate;
}
public void setCreatedate(Date createdate) {
this.createdate = createdate;
}
public void addOrderItem(OrderItems orderitem) {
if (!this.orderItems.contains(orderitem)) {
this.orderItems.add(orderitem);
orderitem.setOrder(this);
}
}
public void removeOrderItem(OrderItems orderitem) {
if (this.orderItems.contains(orderitem)) {
orderitem.setOrder(null);
this.orderItems.remove(orderitem);
}
}
/**
* 返回对象的散列代码值。该实现根据此对象
* 中 orderid 字段计算散列代码值。
* @return 此对象的散列代码值。
*/
@Override
public int hashCode() {
int hash = 0;
hash += (this.orderid != null ? this.orderid.hashCode() : 0);
return hash;
}
/**
* 确定其他对象是否等于此 Order。当且仅当
* 参数不为 null 且该参数是具有与此对象相同 orderid 字段值的 Order 对象时,
* 结果才为 <code>true</code>。
* @param 对象,要比较的引用对象
* 如果此对象与参数相同,则 @return <code>true</code>;
* 否则为 <code>false</code>。
*/
@Override
public boolean equals(Object object) {
if (!(object instanceof Orders)) {
return false;
}
Orders other = (Orders)object;
if (this.orderid != other.orderid && (this.orderid == null || !this.orderid.equals(other.orderid))) return false;
return true;
}
/**
* 返回对象的字符串表示法。该实现根据 orderid 字段
* 构造此表示法。
* @return 对象的字符串表示法。
*/
@Override
public String toString() {
return this.getClass().getName()+ "[orderid=" + orderid + "]";
}
}
OrderItems .java
package com.launch.jpa;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class OrderItems implements Serializable {
private static final long serialVersionUID = -1166337687856636179L;
private Integer id;
private String productname;
private Float price;
private Orders orders;
public OrderItems() {}
public OrderItems(String productname, Float price) {
this.productname = productname;
this.price = price;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=100, nullable=false)
public String getProductname() {
return productname;
}
public void setProductname(String productname) {
this.productname = productname;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
//optional=true 允许为null
@ManyToOne(cascade=CascadeType.REFRESH, optional=false)
@JoinColumn(name = "order_id")
public Orders getOrder() {
return orders;
}
public void setOrder(Orders order) {
this.orders = order;
}
/**
* 返回对象的散列代码值。该实现根据此对象
* 中 id 字段计算散列代码值。
* @return 此对象的散列代码值。
*/
@Override
public int hashCode() {
int hash = 0;
hash += (this.id != null ? this.id.hashCode() : super.hashCode());
return hash;
}
/**
* 确定其他对象是否等于此 OrderItem。当且仅当
* 参数不为 null 且该参数是具有与此对象相同 id 字段值的 OrderItem 对象时,
* 结果才为 <code>true</code>。
* @param 对象,要比较的引用对象
* 如果此对象与参数相同,则 @return <code>true</code>;
* 否则为 <code>false</code>。
*/
@Override
public boolean equals(Object object) {
if (!(object instanceof OrderItems)) {
return false;
}
OrderItems other = (OrderItems)object;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
return true;
}
/**
* 返回对象的字符串表示法。该实现根据 id 字段
* 构造此表示法。
* @return 对象的字符串表示法。
*/
@Override
public String toString() {
return this.getClass().getName()+ "[id=" + id + "]";
}
}
1-m 多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录
onetomany or manytomany 后面的many 默认都是延迟加载
manytoone or onetoone 立即加载
JPA,在@OneToMany里加入mappedBy属性避免生成中间表
使用JPA的时候,如果A B两个实体间是一对多,多对一的关系,如果不在@OneToMany里加入mappedBy属性(相当于inverse=”true”)会导致自动生成一个多余的中间表。
TestOrder .java 测试类
package com.launch.jpa;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestOrder {
static EntityManagerFactory factory;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
factory = Persistence.createEntityManagerFactory("jpa");
}
@Test
public void testInsertOrder() {
try {
EntityManager eManager = factory.createEntityManager();
eManager.getTransaction().begin();
Orders order = new Orders();
order.setCreatedate(new Date());
order.addOrderItem(new OrderItems("笔记本电脑", new Float(13200.5)));
order.addOrderItem(new OrderItems("U盘", new Float(620)));
order.setAmount(new Float(13200.5 + 620));
eManager.persist(order);
eManager.getTransaction().commit();
eManager.close();
factory.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testGetOrderByID() {
EntityManager eManager = factory.createEntityManager();
Orders o = eManager.find(Orders.class, 1);
System.out.println(o.getAmount());
for (OrderItems item : o.getOrderItems()) {
System.out.println(item.getProductname());
}
}
@Test
public void testGetAllOrder() {
EntityManager eManager = factory.createEntityManager();
List<Orders> list = eManager.createQuery("select o from Orders o").getResultList();
for (Orders order : list) {
System.out.println(order.getAmount());
}
}
}