Hibernate 关系映射

本文通过Java实体类示例介绍了不同类型的数据库表关联:一对一(外键与主键方式)、多对一关联,并涵盖了单向与双向关联的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*一对一的单项外键关联*/
@Entity
public class Husband {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private Wife wife;
   
@OneToOne
   
@JoinColumn(name = "wifeId")
   
public Wife getWife() { return wife; }
   
public void setWife(Wife wife) { this.wife = wife; }
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
  
 public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

/*一对一的单向外键关联*/
@Entity
public class Wife {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

/*一对一的双向外键关联*/只要有双向关联,mappedBy必设
@Entity
public class Wife {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
@OneToOne(mappedBy = "wife")//告诉hibernate,在Husband表中的wife属性中已经做了映射,这边不用在生成外键,对方的是主导。
   
private Husband husband;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

 

 

/*一对一的单向主键关联*/(了解)
@Entity
public class HusbandPk {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private Wife wife;
   
@OneToOne
   
@PrimaryKeyJoinColumn//设置主键关联(但是表中并没有建立联系)
   
public Wife getWife() { return wife; }
   
public void setWife(Wife wife) { this.wife = wife; }
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

/*一对一的单向主键关联*/
@Entity
public class WifePk {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private Husband husband;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

/*一对一的双向主键关联*/
@Entity
public class WifePk {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private Husband husband;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
@OneToOne
   
@PrimaryKeyJoinColumn    //建立双向主键关联
   
public Husband getHusband() { return husband; }
   
public void setHusband(Husband husband) { this.husband = husband; }
}

 

 

/*一对一的单项外键联合主键*/
import java.io.Serializable;
import java.util.Objects;
public class WifePK implements Serializable {
   
private Integer id;
   
private String name;
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
@Override
   
public boolean equals(Object o) {
       
if (this == o) return true;
       
if (o == null || getClass() != o.getClass()) return false;
       
WifePK wifePK = (WifePK) o;
        return Objects.equals(id, wifePK.id) &&
               
Objects.equals(name, wifePK.name);
   
}
    @Override
   
public int hashCode() { return Objects.hash(id, name); }
}

/*一对一的单项联合主键关联,假设idname是联合主键*/
@Entity
@IdClass
(WifePK.class) //指名用的是  WifePK类做联合主键
public class Wife {
   
private Integer id;
   
private String name;
   
private Integer age;
   
@Id
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
@Id
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
public Integer getAge() { return age; }
   
public void setAge(Integer age) { this.age = age; }
}

/*一对一的单项联合主键关联*/
@Entity
public class Husband {
   
@Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private Wife wife;
   
@OneToOne   //1)指定联合主键关联时可以不写@JoinColumns2:写的情况如下
   
@JoinColumns(value = {
           
@JoinColumn(name = "wifeId",referencedColumnName = "id"),
           
@JoinColumn(name = "wifeName",referencedColumnName = "name")
   
})
    public Wife getWife() { return wife; }
   
public void setWife(Wife wife) { this.wife = wife; }
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

 

 

/*嵌入类*/(注意同名现象)
public class WifePK implements Serializable {
   
private String wifeName;
   
public String getWifeName() { return wifeName;}
   
public void setWifeName(String wifeName) {this.wifeName = wifeName;}
}

/*一对一的嵌入关联*/
@Entity
public class Husband {
  
 @Column(name = "id")
   
private Integer id;
   
@Column(name = "name")
   
private String name;
   
private WifePK wifePK;
    @Embedded //嵌入式注解
   
public WifePK getWifePK() { return wifePK; }
   
public void setWifePK(WifePK wifePK) { this.wifePK = wifePK; }
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

 

 

/*多对一的单向关联,一个用户在一个分组*/
@Entity
@Table
(name = "t_user")
public class User {
   
private Integer id;
   
private String name;
   
private Group group1;
   
@ManyToOne  //设置多对一关联映射
   
public Group getGroup1() {return group1; }
   
public void setGroup1(Group group1) {this.group1= group1;}
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() {return id;}
   
public void setId(Integer id) {this.id = id;}
   
public String getName() {return name;}
   
public void setName(String name) {this.name = name;}
}


@Entity
@Table
(name = "t_user")
public class Group {
   
private Integer id;
   
private String name;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() {return id; }
   
public void setId(Integer id) {this.id = id; }
   
public String getName() {return name; }
   
public void setName(String name) {this.name = name; }
}

 

 

/*一对多关联映射,一个分组有多个用户*/
@Entity
@Table
(name = "t_user")
public class Group {
   
private Integer id;
   
private String name;
   
private Set<User> userSet;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
@OneToMany
   
@JoinColumn(name = "groupId")
   
public Set<User> getUserSet() { return userSet; }
   
public void setUserSet(Set<User> userSet) { this.userSet = userSet; }
}

@Entity
@Table
(name = "t_user")
public class User {
   
private Integer id;
   
private String name;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
}

 

 

/*多对一、一对多的双向关联*/

@Entity
@Table
(name = "t_group")
public class Group {
   
private Integer id;
   
private String name;
   
private Set<User> userSet;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
@OneToMany(mappedBy = "group"//将关联id设在一方
   
public Set<User> getUserSet() { return userSet; }
   
public void setUserSet(Set<User> userSet) { this.userSet = userSet; }
}


@Entity
@Table
(name = "t_user")
public class User {
   
private Integer id;
   
private String name;
   
private Group group;
   
@Id
   
@GeneratedValue(strategy = GenerationType.IDENTITY)
   
public Integer getId() { return id; }
   
public void setId(Integer id) { this.id = id; }
   
public String getName() { return name; }
   
public void setName(String name) { this.name = name; }
   
@ManyToOne
   
public Group getGroup() { return group; }
   
public void setGroup(Group group) { this.group = group; }
}

 

 

/*多对多单双向关联*/
  @Entity
@Table(name="theacher")
  public class Theacher {
    private Integer id;
    private String name;
    private Set<Student> student = new HashSet<Student>();
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
  
    @ManyToMany
    @JoinTable(name = "t_s",
            joinColumns={@JoinColumn(name = "theacherId")},//指定我方连接Id
            inverseJoinColumns = {@JoinColumn(name = "staudentId")}//反向指定连接Id
    )
    public Set<Student> getStudent() { return student; }
    public void setStudent(Set<Student> student) { this.student = student; }
}

 

@Entity
@Table(name = "student")
  public class Student {
    private Integer id;
    private String name;
    private Set<Theacher> theacherSet;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    @ManyToMany(mappedBy = "student")
    public Set<Theacher> getTheacherSet() { return theacherSet; }
    public void setTheacherSet(Set<Theacher> theacherSet) { this.theacherSet = theacherSet; }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值