Объединение двух объектов в Spring Data JPA

У меня есть две таблицы в базе данных Mysql: отдел и контакт. Я подключился к своему приложению в файле application.properties.

Это моя база данных:

Объединение двух объектов в Spring Data JPA

pom.xml выглядит следующим образом:

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Это мой контактный класс:

@Entity
@Table(name = "contact")
public class Contact {

    @Id
    @Column(name = "contact_id")
    private int Contact_id;

    @Column(name = "emp_name")
    private String Emp_name;

    @Column(name = "mobile")
    private String Mobile;


    @Column(name = "landline_office")
    private String Landline_office;

    @Column(name = "landline_res")
    private String Landline_res;

    @Column(name = "fax")
    private String Fax;

    @Column(name = "email")
    private String Email;

    @ManyToOne(cascade= {CascadeType.PERSIST,CascadeType.MERGE,
            CascadeType.DETACH,CascadeType.REFRESH})
    @JoinColumn(name = "department_dept_id")
    private Department department;

... constructors and getters and setters

Это мой класс отдела:

@Entity
@Table(name = "department")
public class Department {

    @Id
    @Column(name = "dept_id")
    private int Dept_id;

    @Column(name = "dept_name")
    private String Dept_name;

    @Column(name = "order")
    private String Order;

    @Column(name = "home")
    private int Home;

    @OneToMany(mappedBy = "department",
            cascade= {CascadeType.PERSIST,CascadeType.MERGE,
                    CascadeType.DETACH,CascadeType.REFRESH})
    private List<Contact> contacts;

    public Department() {

    }

...getters and setters and constructors

Я могу отобразить первую сущность: отдел в таблице, используя тимелеаф:

Объединение двух объектов в Spring Data JPA

Что я хочу сделать, так это: динамически отображать всех сотрудников, принадлежащих к ICT, когда я нажимаю кнопку «Просмотр» в строке 1 и так для PWD.

Я загрузил проект в github: https://github.com/sammizodev/Jpa_two_tables

Спасибо большое. Но это не моя домашняя работа. Я действительно новичок в java, вот и все. Я пробовал писать много простых приложений с одной таблицей. Это просто хобби.

Sam 22.03.2019 13:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 454
1

Ответы 1

Вот обзор кода кода, который вы публикуете:

Соглашения об именах: вам следует взглянуть на соглашения об именах в java, атрибуты класса должны следовать синтаксису верблюжьего регистра, использование подчеркивания игнорируется.

Вышеупомянутое не должно влиять на схему вашей базы данных, так как вы можете использовать @Column для сопоставления поля таблицы и атрибута класса, например:

@Id
@Column(name = "dept_id")
private int id;

@Column(name = "dept_name")
private String name;

@Column(name = "dept_order")
private String Order;

Обратите внимание, порядок — это ключевое слово во многих базах данных, поэтому вам может потребоваться изменить его.

Успокоительные соглашения: Я бы посоветовал вам взглянуть на спокойный дизайн API, тогда вы сможете понять, как структурировать свое приложение для доступа к определенным ресурсам.

Согласно соглашениям, у вас есть один ресурс (отдел), и вам понадобятся эти URI:

  • URI: ПОЛУЧИТЬ /отдел - /отдел/список.html - Отображение таблицы отдела
  • URI: ПОЛУЧИТЬ /отдел/{id} - /отдел/show.html - Визуализация отдела с подробностями (таблица контактов).

Например, у вас есть GET /departments_list для отображения списка отделов, вместо этого вам нужно изменить его на GET /departments, а ваш шаблон должен называться list.html.

@GetMapping("/departments")
public String listDepartments(Model model) {
    List<Department> departments = departmentService.findAll();
    model.addAttribute("departments",departments);
    return "/departments/list"; // Your current thymeleaf template
}

Затем вам понадобится GET /departments/{id}, чтобы отобразить информацию об отделе, включая список контактов.

Таким образом, в шаблоне списка отделов вы должны создать ссылку, например:

<a th:href = "@{/home/contact/{departmentId}(departmentId=${tempDepartment.dept_id})}"
                class = "btn btn-info btn-sm">View</a>

Обратите внимание, вам нужно указать URL-адрес, например /home/contact/{departmentId}, чтобы tymeleaf мог заменить свойство id, иначе вы получите его в качестве параметра.

На вашем контроллере вам нужно обновить сопоставление с контактами, чтобы включить идентификатор в качестве переменной пути:

@GetMapping("/departments/{id}")
public String listContacts(@PathVariable("id") int theId, Model theModel) {
        Department department = departmentService.findById(theId);
        theModel.addAttribute("department",department);
        return "/departments/show";
}

Если ваш класс отдела загружает контакты с нетерпением, вы можете получить доступ к списку в своем интерфейсе в шаблоне show.html.

<tr th:each = "contact : ${department.contacts}">     
    <td th:text = "${contact.contact_id}" />  
    <td th:text = "${contact.emp_name}" />    
    <td th:text = "${contact.mobile}" />  
    <td th:text = "${contact.landline_office}" />         
</tr>

Кроме того, не забудьте подключить ContactService к своему DemoController.

public DemoController(DepartmentService departmentService, ContactService contactService) {
        this.departmentService = departmentService;
        this.contactService = contactService;
    }

Другие вопросы по теме