Ответ 1
Это выглядит немного напуганным, но я считаю, что он работает так, как вы просили.
Компания
@Entity
@Table(name = "company")
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
@Column(name = "comp_id")
private Integer compId;
@Column(name = "company_name")
private String companyName;
@OneToOne
@JoinColumn(name="emp_id", referencedColumnName="emp_id")
private Employee employee;
@PostPersist
public void postPersist() {
if (id != null && compId == null) {
setCompId(new Integer(id));
}
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public Integer getCompId() {
return compId;
}
public void setCompId(Integer compId) {
this.compId = compId;
}
}
CompanyRepository
public interface CompanyRepository extends JpaRepository<Company, Integer> {
@Query(value = "select a from Company a join fetch a.employee as emp where a.compId = ?1")
public Company findByCmpId(int cmpId);
}
CompanyService
@Service
public class CompanyService {
@Autowired
private CompanyRepository companyRepo;
public Company fetchCompany(int cmpId) {
return companyRepo.findByCmpId(cmpId);
}
}
Сотрудник
@Entity
@Table(name = "employee")
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Integer id;
@Column(name = "emp_id")
private Integer empId;
@Column(name = "emp_name")
private String empName;
@OneToOne
@JoinColumn(name="comp_id", referencedColumnName="comp_id")
private Company company;
@PostPersist
public void postPersist() {
if (id != null && empId == null) {
setEmpId(new Integer(id));
}
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
EmployeeRepository
public interface EmployeeRepository extends JpaRepository<Employee, Integer>
{
@Query(value = "select a from Employee a join fetch a.company as comp where a.empId = ?1")
public Employee findByEmpId(int cmpId);
}
EmployeeService
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepo;
public Employee fetchEmployee(int empId) {
return employeeRepo.findByEmpId(empId);
}
}
Тесты устройств
@RunWith(SpringRunner.class)
@SpringBootTest
public class RnlApplicationTests {
@Autowired
CompanyService companyService;
@Autowired
EmployeeService employeeService;
@Autowired
CompanyRepository companyRepository;
@Autowired
EmployeeRepository employeeRepository;
@Before
public void setup() {
Employee employee = new Employee();
employee.setEmpName("Test Employee");
Company company = new Company();
company.setCompanyName("Test Company");
company = companyRepository.save(company);
employee.setCompany(company);
employee = employeeRepository.save(employee);
company.setEmployee(employee);
company = companyRepository.save(company);
Employee employee2 = new Employee();
employee2.setEmpName("Test Employee2");
Company company2 = new Company();
company2.setCompanyName("Test Company2");
company2 = companyRepository.save(company2);
employee2.setCompany(company2);
employee2 = employeeRepository.save(employee2);
company2.setEmployee(employee2);
company2 = companyRepository.save(company2);
}
@Test
public void testRepository() {
Company company = companyService.fetchCompany(1);
assertThat(company).isNotNull();
Company company2 = companyService.fetchCompany(2);
assertThat(company2).isNotNull();
Employee employee = employeeService.fetchEmployee(1);
assertThat(employee).isNotNull();
Employee employee2 = employeeService.fetchEmployee(2);
assertThat(employee2).isNotNull();
}
}
Настройка для теста несколько повторяется, но мне пришлось настроить его таким образом, чтобы эти тестовые примеры работали. Вероятно, вы можете найти лучший способ.
Выход Hibernate SQL из теста компании
select
company0_.id as id1_0_2_,
company0_.comp_id as comp_id2_0_2_,
company0_.company_name as company_3_0_2_,
company0_.emp_id as emp_id4_0_2_,
employee1_.id as id1_1_0_,
employee1_.comp_id as comp_id4_1_0_,
employee1_.emp_id as emp_id2_1_0_,
employee1_.emp_name as emp_name3_1_0_,
company2_.id as id1_0_1_,
company2_.comp_id as comp_id2_0_1_,
company2_.company_name as company_3_0_1_,
company2_.emp_id as emp_id4_0_1_
from
company company0_
left outer join
employee employee1_
on company0_.emp_id=employee1_.emp_id
left outer join
company company2_
on employee1_.comp_id=company2_.comp_id
where
company0_.comp_id=?
Выход Hibernate SQL из теста Employee
select
employee0_.id as id1_1_0_,
company1_.id as id1_0_1_,
employee0_.comp_id as comp_id4_1_0_,
employee0_.emp_id as emp_id2_1_0_,
employee0_.emp_name as emp_name3_1_0_,
company1_.comp_id as comp_id2_0_1_,
company1_.company_name as company_3_0_1_,
company1_.emp_id as emp_id4_0_1_
from
employee employee0_
inner join
company company1_
on employee0_.comp_id=company1_.comp_id
where
employee0_.emp_id=?