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);
}

}


一对一,和谐的夫妻制度,有人说着是性能力差的人想出来的,不知道说这话的人性能力咋样.....

一对一怎么决定维护端,jpa没规定,自己决定

附上代码

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;

@Entity
public class IDCard {

private Integer id;
private String 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
@GeneratedValue
public 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;

@Entity
public class Student {
private Integer id;
private String name;
private IDCard idCard_id;
@Id
@GeneratedValue
public 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;
@Entity
public 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
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public 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;

@Entity
public 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
@GeneratedValue
public 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);
}
}

}

另外附上jpa对联合主键的处理

jpa规定

联合主键:
无参构造
必须要实现序列化接口
必须要重写hashcode equls方法

package com.itcast.domail;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public 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;
}
@Override
public 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;
}
@Override
public 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;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值