一、介绍表关联的三种结构
二、关联表的注解【截图,表格不好贴出来,下载我的资料呗】
三、演示案例如下
1)OneToOne 一对一的映射
@Entity
@Table(name="t_herat")
public class Heart {
private Long id;
private String code;
private Body body;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getCode() {
return code;
}
// mappeBy表示“放弃维护主键,这一方不生成主键。在表结构中,单方向就可以”
@OneToOne(mappedBy="heart")
public Body getBody() {
return body;
}
public void setId(Long id) {
this.id = id;
}
public void setCode(String code) {
this.code = code;
}
public void setBody(Body body) {
this.body = body;
}
}
@Entity
@Table(name="t_body")
public class Body
{
private Long id;
private String code;
//一 对 一 关 联
private Heart heart;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getCode() {
return code;
}
@OneToOne(cascade=CascadeType.ALL)//,fetch=FetchType.LAZY 默认为LAZY
// @PrimaryKeyJoinColumn //主键关联
// @JoinColumn//默认 关联外键
// @JoinTable( //引用第三方的表进行关联
// name="tr_body_heart",
// joinColumns=@JoinColumn(name="body_id"),
// inverseJoinColumns = @JoinColumn(name="heart_id")
// )
public Heart getHeart() {
return heart;
}
public void setId(Long id) {
this.id = id;
}
public void setCode(String code) {
this.code = code;
}
public void setHeart(Heart heart) {
this.heart = heart;
}
}
演示结果如下:
1.1 如果是:@JoinColumn//默认 关联外键
1.2 如果是:@PrimaryKeyJoinColumn
1.3 如果是:@ JoinTable
1.4 如果是:没有添加 mappedBy=”heart”
所以在从端,一定要放弃一个外键
2)ManyToOne 或者OneToMany
有了第一个例子之后,第二个例子就简单多了。
@Entity
@Table(name="t_flight")
public class Flight {
private Long id;
private String description;
private Company company;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getDescription() {
return description;
}
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn
public Company getCompany() {
return company;
}
public void setId(Long id) {
this.id = id;
}
public void setDescription(String description) {
this.description = description;
}
public void setCompany(Company company) {
this.company = company;
}
@Override
public String toString() {
return "Flight [id=" + id + ", description=" + description + "]";
}
}
@Entity
@Table(name="t_company")
public class Company {
private Long id;
private String name;
private List<Flight> flightList= new ArrayList<Flight>();
public Company() {
}
public Company(Long id, String name) {
super();
this.id = id;
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getName() {
return name;
}
@OneToMany(mappedBy="company")
public List<Flight> getFlightList() {
return flightList;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setFlightList(List<Flight> flightList) {
this.flightList = flightList;
}
@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", flightList=" + flightList + "]";
}
}
演示结果如下:
2.1 如果是:@JoinColumn//默认 关联外键
2.2 如果是:@ JoinTable
没有意义,用第三方表维护,有兴趣的可以试一下
如果是:没有添加 mappedBy=”heart”
不可以,双向关联,gg
3)ManyToMany
@Entity
@Table(name="t_a")
public class ManyA {
private Long id;
private String name;
private List<ManyB> manyAList = new ArrayList<ManyB>();
public ManyA() {
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getName() {
return name;
}
@ManyToMany(mappedBy="manyAList")
public List<ManyB> getManyAList() {
return manyAList;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setManyAList(List<ManyB> manyAList) {
this.manyAList = manyAList;
}
}
@Entity
@Table(name="t_b")
public class ManyB {
private Long id;
private String name;
private List<ManyA> manyAList = new ArrayList<ManyA>();
public ManyB() {
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long getId() {
return id;
}
public String getName() {
return name;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
name = "t_a_b",
joinColumns = @JoinColumn(name="a_id"),
inverseJoinColumns = @JoinColumn(name="b_id")
)
public List<ManyA> getManyAList() {
return manyAList;
}
public void setManyAList(List<ManyA> manyAList) {
this.manyAList = manyAList;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
演示结果如下:
3.1 如果是:没有添加 mappedBy=”heart”
建议还是加把,有兴趣可以测试去看看。
四、演示案例如下
@Test
public void testHbm() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure()
.build();
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
}