0%

数据库设计技巧

设计数据库的一些坑的总结。

1.Int与Integer的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 学生
* 在使用Hibernate设计数据表声明数据类型时,Java代码中ID一般都设置成Integer类型,因为它可以默认为null,而
* 在使用性别时,一般都是使用Int类型
*/
@Entity
@Table(name = "tb_student")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Student {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
// 姓名
private String name;
// 年龄
private int age;
// 性别
private int gender;
}

2.有依赖关联表与无依赖关联表

一张表里只能有一个主键,或者有一种情况是one primary key included two fileds.
有依赖关联表:通过在用户信息表里加入用户ID实现两张表的关联。

有依赖关联表
具体实现:
逻辑模型
有依赖关联表
物理模型
有依赖关联表


无依赖关联表:通过引入第三张表来进行用户表与用户信息表的关联。

无依赖关联表

3.Hibernate中一对一、一对多以及多对多的注解实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 1:1 <==> Person:IdCard
// Person.java
@Entity
@Table(name = "tb_person")
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

// 姓名
private String name;

// 年龄
private int age;

// 身份证
@OneToOne(mappedBy="person") //放弃维护主控权
private IdCard card;
}
//IdCard.java
@Entity
@Table(name = "tb_idcard")
public class IdCard {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

// 身份证号
private String sno;

// 所属人
@OneToOne
@JoinColumn(name="person_id", unique=true)
private Person person;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 1:n <==> Department:Employee
// Department.java
@Entity
@Table(name = "tb_dept")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Department {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

// 名称
@Column(length = 50)
private String name;

// 默认实体类所有字段都映射, 可使用@Transient声明不做映射
private int sn;

// 拥有多个员工
@OneToMany(mappedBy = "dept") //mappedBy:表示放弃维护主控权
private Set<Employee> emps = new HashSet<Employee>();
}
// Employee.java
@Entity
@Table(name="tb_emp")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Employee {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
// 姓名
private String name;

// 部门
@ManyToOne
@JoinColumn(name="dept_id")
private Department dept;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// n:n <==> Course:Student
// Course.java
@Entity
@Table(name = "tb_course")
public class Course {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// 名称
private String name;

// 学生
@ManyToMany
@JoinTable(name="tb_student_course",
joinColumns=@JoinColumn(name="course_id"),
inverseJoinColumns=@JoinColumn(name="student_id"))
private Set<Student> students = new HashSet<Student>();
}
// Student.java
@Entity
@Table(name="tb_student")
public class Student {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
// 姓名
private String name;
// 课程
@ManyToMany(mappedBy="students")
private Set<Course> courses = new HashSet<Course>();
}