JPA一对多双向配置实例

来源:互联网 发布:活了一百万次的猫 知乎 编辑:程序博客网 时间:2024/06/14 05:13

在JPA中双向一对多关系则多方为关系护端即负责外键记录的更新,一方为被维护端即没有权力更新外键记录

src下在面的META-INF/persistence.xml配置如下:

<?xml version="1.0"?><persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0"><persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL"><properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /><property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" /><property name="hibernate.connection.username" value="root" /><property name="hibernate.connection.password" value="root" /><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8" /><property name="hibernate.hbm2ddl.auto" value="update" /></properties></persistence-unit></persistence>

订单和订单项两个实例实体Bean如下:

订单表

@Table(name="t_order")@Entitypublic class Order {private String orderId;/**设置默认值*/private Float amount = 0f;/** * 一对多也可以使用List(使用xml配置稍微麻烦一些),并不一定要用Set,如果多的一方是要排序输出的, * 则使用ArrayList可以方便一些。一定程度上Set比List性能好,所以一般情况下都是使用Set较多 */private Set<OrderItem> items = new HashSet<OrderItem>();@Id@Column(length = 12)public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}@Column(nullable = false)public Float getAmount() {return amount;}public void setAmount(Float amount) {this.amount = amount;}/** cascade表示级联操作*//** CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法*//** CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据*//** CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法*//** CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法*//** FetchType.LAZY表示懒加载。对于xxxtoMany时即获得多的一方fetch的默认值是FetchType.LAZY懒加载。对于xxxtoOne时即获得一的一方fetch的默认值是FetchType.EAGER立即加载*//** mappedBy表示关系统被维护端,它的值是关系维护端维护关系的属性 */@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.LAZY, mappedBy = "order")public Set<OrderItem> getItems() {return items;}public void setItems(Set<OrderItem> items) {this.items = items;}/** * 自己的加的一个方法,为了方便添加OrderItem */public void addOrderItem(OrderItem item) {item.setOrder(this);this.items.add(item);} }

订单项表:
/** * 1-m * 多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权力更新外键记录 * */@Table(name="t_orderItem")@Entitypublic class OrderItem {private Integer id;private String productName;private Float sellPrice = 0f;private Order order;@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}@Column(nullable = false)public Float getSellPrice() {return sellPrice;}public void setSellPrice(Float sellPrice) {this.sellPrice = sellPrice;}/**cascade表示级联。CascadeType.REFRESH级联刷新  */    /**optional表示该对象可有可无,它的值为true表示该外键可以为null,它的值为false表示该外键为not null*/   @ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, optional = false)/**JoinColumn表示外键的列  */@JoinColumn(name="orderId")   public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}
测试:

public class OneToManyTest {static EntityManagerFactory factory = null;EntityManager em=null;@BeforeClasspublic static void setUpBeforeClass() throws Exception {factory=Persistence.createEntityManagerFactory("itcast");}@Testpublic void save() {em=factory.createEntityManager();em.getTransaction().begin();Order order=new Order();order.setAmount(5000f);order.setOrderId("20140908");OrderItem orderItem1=new OrderItem();orderItem1.setProductName("pc");orderItem1.setSellPrice(4000f);OrderItem orderItem2=new OrderItem();orderItem2.setProductName("phone");orderItem2.setSellPrice(1000f);order.addOrderItem(orderItem1);order.addOrderItem(orderItem2);em.persist(order);em.getTransaction().commit();factory.close();}}

 mysql数据表:

 一对多关系映射图:


说明:本人于ITEYE创建于2013年,现转移到CSDN


0 0
原创粉丝点击