Hibernate的关系映射总结annotation版本(一)

2014-11-24 08:05:15 · 作者: · 浏览: 3

Hibernate关系一般分成这么几种情况:一对一单向,一对一双向,一对多单向,多对一单向,一对多双向,多对一双向,多对多单向,多对多双向。

1:一对一单向

@Entity
public class Husband {
		private int id;
		private String name;
		private Wife wife;
		@Id
		@GeneratedValue
		public int getId() {
			return id;
		}
		public String getName() {
			return name;
		}
		@OneToOne
		@JoinColumn(name="wife")//定义字段名称..
		public Wife getWife() {
			return wife;
		}
		public void setId(int id) {
			this.id = id;
		}
		public void setName(String name) {
			this.name = name;
		}
		public void setWife(Wife wife) {
			this.wife = wife;
		}
}
public class Wife {
		private int id;
		private String name;
		@Id
		@GeneratedValue
		public int getId() {
			return id;
		}
		public String getName() {
			return name;
		}
		public void setId(int id) {
			this.id = id;
		}
		public void setName(String name) {
			this.name = name;
		}
}
create table Husband (id integer not null auto_increment, name varchar(255), wife integer, primary key (id))
create table Wife (id integer not null auto_increment, name varchar(255), primary key (id))
alter table Husband add index FKAEEA401BAECA6750 (wife), add constraint FKAEEA401BAECA6750 foreign key(wife) references Wife (id)


2:一对一双向

public class Husband {
		private int id;
		private String name;
		private Wife wife;
		@Id
		@GeneratedValue
		public int getId() {
			return id;
		}
		public String getName() {
			return name;
		}
		@OneToOne
		@JoinColumn(name="wife")//定义字段名称..
		public Wife getWife() {
			return wife;
		}
		public void setId(int id) {
			this.id = id;
		}
		public void setName(String name) {
			this.name = name;
		}
		public void setWife(Wife wife) {
			this.wife = wife;
		}
}
public class Wife {
		private int id;
		private String name;
		private Husband husband;
		@OneToOne(mappedBy="wife")
		//双向外键关联需要设置mappedBy,否则会有冗余
		//其中"wife"为Husband的get方法中的wife,还不是那个wife字段。
		
		public Husband getHusband() {
			return husband;
		}
		public void setHusband(Husband husband) {
			this.husband = husband;
		}
		@Id
		@GeneratedValue
		public int getId() {
			return id;
		}
		public String getName() {
			return name;
		}
		public void setId(int id) {
			this.id = id;
		}
		public void setName(String name) {
			this.name = name;
		}
}


不要忘了mappedBy,否则会生成两个外键关联。

其实单向和双向生成的表没什么区别,区别只是单向的时候只能由一方获得另外一方,而双向则是每一方都能获得对方。

create table Husband (id integer not null auto_increment, name varchar(255), wife integer, primary key (id))
create table Wife (id integer not null auto_increment, name varchar(255), primary key (id))
alter table Husband add index FKAEEA401BAECA6750 (wife), add constraint FKAEEA401BAECA6750 foreign key (wife) references Wife (id)


3:多对一

@Entity
@Table(name="t_group")
public class Group {
	private int id;
	private String name;
	@Id
	@GeneratedValue
	@Column(name="group_id")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

@Table(name="t_user")
public class User {
	private int id;
	private String name;
	private Group group;
	@ManyToOne
	@JoinColumn(name="id_group")
	public Group getGroup() {
		return group;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	public void setGrou