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

2014-11-24 08:05:15 · 作者: · 浏览: 1
p(Group group) { this.group = group; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } }


多对一外键关联的表设计是把一那一方的id放在多的那一方表中,如果反过来则会产生冗余。

create table t_group (group_id integer not null auto_increment, name varchar(255), primary key (group_id))
create table t_user (id integer not null auto_increment, name varchar(255), id_group integer, primary key (id))
alter table t_user add index FKCB63CCB6102EF96C (id_group), add constraint FKCB63CCB6102EF96C foreign key (id_group) references t_group (group_id)

4:一对多

@Table(name="t_group")

public class Group {
	private int id;
	private String name;
	private Set
  
    users;
	@Id
	@GeneratedValue
	@Column(name="group_id")
	public int getId() {
		return id;
	}
	@OneToMany
	@JoinColumn(name="group_id")
	//不要忘了joinColumn,否则会认为是多对多的一种,会生成一张中间表.
	public Set
   
     getUsers() { return users; } public void setUsers(Set
    
      users) { this.users = users; } 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;

	@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 t_group (group_id integer not null auto_increment, name varchar(255), primary key (group_id))
create table t_user (id integer not null auto_increment, name varchar(255), group_id integer, primary key (id))
alter table t_user add index FKCB63CCB6411589EC (group_id), add constraint FKCB63CCB6411589EC foreign key (group_id) references t_group (group_id)

如果没有@JoinColumn(name="group_id"),那么会怎么样呢?

create table t_group (group_id integer not null auto_increment, name varchar(255), primary key (group_id))
create table t_group_t_user (t_group_group_id integer not null, users_id integer not null, primary key (t_group_group_id, users_id), unique (users_id))
create table t_user (id integer not null auto_increment, name varchar(255), primary key (id))
alter table t_group_t_user add index FKCFE61C612E429AD7 (t_group_group_id), add constraint FKCFE61C612E429AD7 foreign key (t_group_group_id) references t_group (group_id)
alter table t_group_t_user add index FKCFE61C619EBDBBAB (users_id), add constraint FKCFE61C619EBDBBAB foreign key (users_id) references t_user (id)


它会生成一张中间表。当作是多对多。

5:多对多单向

public class Teacher {
	private int id;
	private String name;
	private Set
  
    students;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	@ManyToMany
	@JoinTable(
			name="t_s",
			joinColumns={
					@JoinColumn(name="teacherId")},
			inverseJoinColumns={@JoinColumn(name="studentId")}	
	)
	//如果不加@JoinTable,那么中间关系表属性就是teachersidd, studentsid。而JoinTable就是为了改变这个名称的。
	public Set
   
     getStudents() { return students; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setStudents(Set
    
      students) { this.students = students; } } 
    
   
  


public class Student {
	private int id ;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	
	
	publ