Ваша конечная цель - найти всех консультантов, связанных с конкретной консультацией. Это отношения OneToMany со стороны консультанта и отношения OneToOne со стороны консультанта, предполагающие, что конкретный консультант может быть связан с одним консультантом в данный момент времени. Для этого есть две вещи.
- Во-первых, вы должны исправить соглашения JPA Spring Data для поля
consultancy_id
. Я сделал это, назвав поле consultancyId
и используя имя @Column
- см. Ниже.
- Далее необходимо правильно настроить отношения JPA в ваших сущностях. Вы можете или не можете использовать подход к объединению таблиц, но я так и сделал.
Сущность Consultancy
:
@Entity
@Table(name="consultancy")
public class Consultancy {
@Id
@GeneratedValue(generator = "id_generator")
@SequenceGenerator(
name = "id_generator",
sequenceName = "id_sequence",
initialValue = 1
)
@Column(name= "consultancy_id", nullable = false)
private Long consultancyId;
@Column(nullable = false)
private String consultancy_name;
@Column(unique = true, nullable = false)
private String consultancy_email;
@Column(nullable = false)
private String consultancy_phone;
@Column(nullable = false)
private String consultancy_website;
@Column(nullable = false)
private String consultancy_address;
@OneToMany(targetEntity = Consultant.class, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "consultant_consultancy_join_table",
joinColumns = @JoinColumn(name = "consultancy_id"),
inverseJoinColumns = @JoinColumn(name = "consultant_id"))
@Fetch(value = FetchMode.SUBSELECT)
private Collection<Consultant> consultants;
public Consultancy() {
}
public Consultancy(String consultancy_name, String consultancy_email, String consultancy_phone, String consultancy_website, String consultancy_address) {
this.consultancy_name = consultancy_name;
this.consultancy_email = consultancy_email;
this.consultancy_phone = consultancy_phone;
this.consultancy_website = consultancy_website;
this.consultancy_address = consultancy_address;
}
public Long getConsultancyId() {
return consultancyId;
}
public void setConsultancyId(Long consultancyId) {
this.consultancyId = consultancyId;
}
public String getConsultancy_name() {
return consultancy_name;
}
public void setConsultancy_name(String consultancy_name) {
this.consultancy_name = consultancy_name;
}
public String getConsultancy_email() {
return consultancy_email;
}
public void setConsultancy_email(String consultancy_email) {
this.consultancy_email = consultancy_email;
}
public String getConsultancy_phone() {
return consultancy_phone;
}
public void setConsultancy_phone(String consultancy_phone) {
this.consultancy_phone = consultancy_phone;
}
public String getConsultancy_website() {
return consultancy_website;
}
public void setConsultancy_website(String consultancy_website) {
this.consultancy_website = consultancy_website;
}
public String getConsultancy_address() {
return consultancy_address;
}
public void setConsultancy_address(String consultancy_address) {
this.consultancy_address = consultancy_address;
}
public Collection<Consultant> getConsultants() {
return consultants;
}
public void setConsultants(Collection<Consultant> consultants) {
this.consultants = consultants;
}
}
Consultant
сущность:
@Entity
@Table(name = "consultant")
public class Consultant {
@Id
@GeneratedValue(generator = "id_generator")
@SequenceGenerator(
name = "id_generator",
sequenceName = "id_sequence",
initialValue = 1
)
private Long consultant_id;
@Column(nullable = false)
private String consultant_first_name;
@Column(nullable = false)
private String consultant_last_name;
@Column(nullable = false)
private String consultant_phone;
@Column(nullable = false)
private String consultant_email;
@Column(nullable = false)
private String consultant_password;
@Column(nullable = false)
private boolean consultant_is_admin;
@OneToOne(targetEntity = Consultancy.class, fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "consultant_consultancy_join_table",
joinColumns = @JoinColumn(name = "consultant_id"),
inverseJoinColumns = @JoinColumn(name = "consultancy_id"))
private Consultancy consultancy;
public Consultant(){}
public Consultant(String consultant_first_name, String consultant_last_name, String consultant_phone, String consultant_email, String consultant_password, boolean consultant_is_admin, Consultancy consultancy) {
this.consultant_first_name = consultant_first_name;
this.consultant_last_name = consultant_last_name;
this.consultant_phone = consultant_phone;
this.consultant_email = consultant_email;
this.consultant_password = consultant_password;
this.consultant_is_admin = consultant_is_admin;
this.consultancy = consultancy;
}
public Long getConsultant_id() {
return consultant_id;
}
public void setConsultant_id(Long consultant_id) {
this.consultant_id = consultant_id;
}
public String getConsultant_first_name() {
return consultant_first_name;
}
public void setConsultant_first_name(String consultant_first_name) {
this.consultant_first_name = consultant_first_name;
}
public String getConsultant_last_name() {
return consultant_last_name;
}
public void setConsultant_last_name(String consultant_last_name) {
this.consultant_last_name = consultant_last_name;
}
public String getConsultant_phone() {
return consultant_phone;
}
public void setConsultant_phone(String consultant_phone) {
this.consultant_phone = consultant_phone;
}
public String getConsultant_email() {
return consultant_email;
}
public void setConsultant_email(String consultant_email) {
this.consultant_email = consultant_email;
}
public String getConsultant_password() {
return consultant_password;
}
public void setConsultant_password(String consultant_password) {
this.consultant_password = consultant_password;
}
public boolean isConsultant_is_admin() {
return consultant_is_admin;
}
public void setConsultant_is_admin(boolean consultant_is_admin) {
this.consultant_is_admin = consultant_is_admin;
}
public Consultancy getConsultancy() {
return consultancy;
}
public void setConsultancy(Consultancy consultancy) {
this.consultancy = consultancy;
}
}
Схема базы данных (я использую диалект Derby, выберите подходящий для вашей БД):
-- Consultant table
create table consultant (
consultant_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
consultant_first_name VARCHAR(50) NOT NULL,
consultant_last_name VARCHAR(50) NOT NULL,
consultant_phone VARCHAR(50) NOT NULL,
consultant_email VARCHAR(50) NOT NULL,
consultant_password VARCHAR(50) NOT NULL,
consultant_is_admin boolean NOT NULL DEFAULT false
);
-- Consultancy table
create table consultancy (
consultancy_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
consultancy_name VARCHAR(50) NOT NULL,
consultancy_email VARCHAR(50) NOT NULL,
consultancy_phone VARCHAR(50) NOT NULL,
consultancy_website VARCHAR(50) NOT NULL,
consultancy_address VARCHAR(50) NOT NULL
);
-- Join table
CREATE TABLE consultant_consultancy_join_table (
consultant_id BIGINT NOT NULL,
consultancy_id BIGINT NOT NULL,
CONSTRAINT fk_consultant_id FOREIGN KEY (consultant_id) REFERENCES consultant(consultant_id),
CONSTRAINT fk_consultancy_id FOREIGN KEY (consultancy_id) REFERENCES consultancy (consultancy_id)
);
Некоторые данные испытаний:
insert into consultant (consultant_first_name, consultant_last_name, consultant_phone, consultant_email, consultant_password, consultant_is_admin) values
('John', 'Doe', '210-917-6789', 'john.doe@acme.com', 'work2eat', true),
('Jane', 'Doe', '210-867-7635', 'jane.doe@acme.com', 'work2eat', true);
insert into consultancy (consultancy_name, consultancy_email, consultancy_phone, consultancy_website, consultancy_address) values
('Acme Consultancy', 'info@acme.com', '210-902-8956', 'www.acme.com', '9910, Any Street, San Antonio, TX, 78210');
insert into consultant_consultancy_join_table(consultant_id, consultancy_id) values
(1,1),
(2,1);
Класс ConsultancyRepository
:
public interface ConsultancyRepository extends CrudRepository<Consultancy, Long> {
Consultancy findByConsultancyId (Long consultancyId);
}
A JUnit Контрольный пример:
public class ConsultancyRepositoryTest {
@Autowired
private ConsultancyRepository consultancyRepository;
@Test
public void testGetAllConsultants() {
Consultancy consultancy = consultancyRepository.findByConsultancyId(1L);
assertNotNull(consultancy);
assertEquals(2, consultancy.getConsultants().size());
}
}