JPA--三种关系的处理
一对多关系:男人经常幻想自己有这个,一个男对应上N个女人,可惜在数据库里面这个关系的维护jpa规范却交给了多的一方来维护,男的是被维护端....
代码附加:
mappedBy来声明为被维护端,指定的值是关系维护端由哪个属性去维护这个关系,类似hibernate里面<set name="items" inverse="true"/>
多对一这边也需要声明manytoone
optional=false
不可选代表必须要存在,不能为null
多对以要设置外键名称,@JoinColumn
hibernate <manytonoe column="">
这里面叫order和关键字冲突.通过table来修改
事物问题
你对这个数据进行处理,当处理完却被别人修改了.如果你再查询,会从缓存把你那个依旧拿出来,如果你要调用最新只能refresh(person)
如果后面是many默认就延迟加载,其他是立即加载.
附上此代码:
package com.itcast.domail;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.Table;@Entity@Table(name="t_order")public class Order {private String orderid;private Float amount;private Set<OrderItem> items=new HashSet<OrderItem>();@OneToMany(cascade={CascadeType.REMOVE,CascadeType.MERGE,CascadeType.PERSIST },fetch=FetchType.LAZY,mappedBy="order")public Set<OrderItem> getItems() {return items;}public void setItems(Set<OrderItem> items) {this.items = items;}@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;}//下面这个方法说明了两者在数据库里的关系public void addOrderItem(OrderItem orderItem){orderItem.setOrder(this);this.items.add(orderItem);}}package com.itcast.domail;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToOne;@Entitypublic class IDCard {private Integer id;privateString cardId;private Student student;//关系的被维护端,由业务需要决定级联@OneToOne(mappedBy="idCard_id",cascade={CascadeType.PERSIST,CascadeType.MERGE,},optional=false)public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(length=18,nullable=false)public String getCardId() {return cardId;}public void setCardId(String cardId) {this.cardId = cardId;}}package com.itcast.domail;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.OneToOne;@Entitypublic class Student {private Integer id;private String name;private IDCard idCard_id;@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(length=10,nullable=false)public String getName() {return name;}public void setName(String name) {this.name = name;}@OneToOne(cascade={CascadeType.REMOVE,CascadeType.PERSIST,CascadeType.MERGE})//关系维护端定义外键@JoinColumn(name="card_id",nullable=false)public IDCard getIdCard_id() {return idCard_id;}public void setIdCard_id(IDCard idCard_id) {this.idCard_id = idCard_id;}public void addCard(IDCard card){card.setStudent(this);this.setIdCard_id(card);}}package com.itcast.domail;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToMany;@Entitypublic class Girl {private String name;private Integer id;private Set<Boy> boyFriends=new HashSet<Boy>();@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER,mappedBy="girlFriends")public Set<Boy> getBoyFriends() {return boyFriends;}public void setBoyFriends(Set<Boy> boyFriends) {this.boyFriends = boyFriends;}@Column(nullable=false,length=10)public String getName() {return name;}public void setName(String name) {this.name = name;}@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;final Girl other = (Girl) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;return true;}}package com.itcast.domail;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;@Entitypublic class Boy {private String name;private Integer id;private Set<Girl> girlFriends=new HashSet<Girl>();@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST})@JoinTable(name="boy_girl",joinColumns=@JoinColumn(name="boy_id"),inverseJoinColumns=@JoinColumn(name="girl_id"))public Set<Girl> getGirlFriends() {return girlFriends;}public void setGirlFriends(Set<Girl> girlFriends) {this.girlFriends = girlFriends;}@Column(nullable=false,length=10)public String getName() {return name;}public void setName(String name) {this.name = name;}@Id@GeneratedValuepublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public void addGirl(Girl girl){this.girlFriends.add(girl);}//需要重写Gril的hashcode与equls方法public void removeGirl(Girl girl){if(this.girlFriends.contains(girl)){this.girlFriends.remove(girl);}}}package com.itcast.domail;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Embeddable;@Embeddablepublic class AirLinePK implements Serializable{private String startCity;private String endCity;@Column(length=3)public String getStartCity() {return startCity;}public void setStartCity(String startCity) {this.startCity = startCity;}@Column(length=3)public String getEndCity() {return endCity;}public void setEndCity(String endCity) {this.endCity = endCity;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((endCity == null) ? 0 : endCity.hashCode());result = prime * result+ ((startCity == null) ? 0 : startCity.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;final AirLinePK other = (AirLinePK) obj;if (endCity == null) {if (other.endCity != null)return false;} else if (!endCity.equals(other.endCity))return false;if (startCity == null) {if (other.startCity != null)return false;} else if (!startCity.equals(other.startCity))return false;return true;}}