之前已经说了oneToOne和ManyToMany : SpringBoot-SpringData-ManyToMany
现在说一下ManyToOne和OneToMany
模型
公司和职员的关系是一对多,一个公司有多个职员,而通常每个职员只能服务于一家公司
说明:
多对一和一对多其实说的是一种情况
一方相对另一方是一对多,则另一方相对与之前那一方就是多对一
多对一和一对多,主要的一方都是多的那一方(即单条数据间的关联外键字段所在表)
项目结构
两个domain,公司类Company和职员类Employee
两个dao,公司和职员的数据库操作层
一个测试类OneToManyTest.java
Domain
员工类
@Entity
@Table(name = "t_employee")
public class Employee {
private Integer employeeId;
private String employeeName;
private Company company;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getEmployeeId() {
return employeeId;
}
/**
* @ManyToOne:多对一
*/
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH},fetch = FetchType.EAGER)
@JoinColumn(name = "cid")
public Company getCompany() {
return company;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public void setCompany(Company company) {
thispany = company;
}
}
公司类
@Entity
@Table(name = "t_company")
public class Company {
private Integer companyId;
private String companyName;
private Set<Employee> employees;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getCompanyId() {
return companyId;
}
/**
* @OneToMany 一对多
* mappedBy,参考了Employee,与 OneToOne相似
*/
@OneToMany(mappedBy = "company", fetch = FetchType.EAGER)
public Set<Employee> getEmployees() {
return employees;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyId(Integer companyId) {
thispanyId = companyId;
}
public void setCompanyName(String companyName) {
thispanyName = companyName;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
DAO
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
public interface CompanyRepository extends JpaRepository<Company, Long> {
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(DemoApplication.class)
public class OneToManyTest {
@Autowired
private EmployeeRepository employeeRepository;
@Autowired
private CompanyRepository companyRepository;
@Before
public void testData(){
//添加公司(和员工关系)
Company company1 = new Company();
company1.setCompanyId(1);
company1.setCompanyName("company1");
Company company2 = new Company();
company2.setCompanyId(2);
company2.setCompanyName("company2");
companyRepository.save(company1);
companyRepository.save(company2);
//添加员工
Employee employee1 = new Employee();
employee1.setEmployeeId(1);
employee1.setEmployeeName("employee1");
employee1.setCompany(company1);
Employee employee2 = new Employee();
employee2.setEmployeeId(2);
employee2.setEmployeeName("employee2");
employee2.setCompany(company1);
Employee employee3 = new Employee();
employee3.setEmployeeId(3);
employee3.setEmployeeName("employee3");
employee3.setCompany(company2);
Employee employee4 = new Employee();
employee4.setEmployeeId(4);
employee4.setEmployeeName("employee4");
employee4.setCompany(company2);
employeeRepository.save(employee1);
employeeRepository.save(employee2);
employeeRepository.save(employee3);
employeeRepository.save(employee4);
}
@Test
public void test() throws Exception {
// 员工映射公司
Employee employee = employeeRepository.findOne(1);
Company company_Temp = employee.getCompany();
Assert.assertEquals("company1", company_Temp.getCompanyName());
// 公司映射员工
Company company = companyRepository.findOne(1);
Set<Employee> employees = company.getEmployees();
Assert.assertEquals(2, employees.size());
}
}
测试结果
取公司获得员工实例(一对多)
取员工获得公司实例(多对一)
数据库数据
数据库关系
CREATE TABLE `t_employee` (
`employee_id` int(11) NOT NULL AUTO_INCREMENT,
`employee_name` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`employee_id`),
KEY `FK_m2hn6l9dvyd7f67ejbl8u6864` (`cid`),
CONSTRAINT `FK_m2hn6l9dvyd7f67ejbl8u6864` FOREIGN KEY (`cid`) REFERENCES `t_company` (`company_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `t_company` (
`company_id` int(11) NOT NULL AUTO_INCREMENT,
`company_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`company_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
主的一方为雇员方,也就是”多对一”中”多”的一方
代码下载
CSDN下载
GitHub下载
更多推荐
SpringBoot-SpringData-ManyToOne
发布评论