Гибернация обновления дочерних записей в сопоставлении один ко многим - PullRequest
0 голосов
/ 16 января 2020

У меня есть

  1. стол компании

  2. стол отдела

  3. стол сотрудника.

Я использую спящий режим для сохранения данных в базе данных.

1. Отношения «один ко многим» между компанией и отделом.

В компании может быть несколько отделов, а в отделе может быть несколько сотрудников.

Я сделал соответствующее сопоставление сущностей один ко многим, как упомянуто в коде ниже. Запрос на обновление этих объектов поступает из пользовательского интерфейса в формате JSON.

Я указал в запросе идентификатор компании, идентификатор отдела и идентификатор сотрудника. Теперь предположим, что для конкретной компании в базе данных есть один отдел с dept_id 3. , В запросе Json я получаю запрос на обновление этой конкретной компании еще одним отделом. Поэтому после обновления предыдущая запись должна оставаться без изменений, т. Е. Отдел с идентификатором 3 должен оставаться нетронутым, а новая запись должна добавляться с некоторым идентификатором отдела, скажем, 4.

Теперь у этой компании будет два отдела, один с идентификатором 3, а другой с идентификатором 4.

Как этого можно достичь ?? .. Также записи отделов, которых нет в запросе, должны быть удалены из базы данных ... То же самое касается отношений между сотрудником и отделом, .request может попросить добавить нового сотрудника для определенного отдела, оставив существующий.

Пожалуйста, помогите мне с этим, что Конфигурация / подход должны быть сделаны в моем коде, чтобы достичь этого. Вот код для этих трех таблиц:

@Entity
@Table(name = "COMPANY")
@Getter
@Setter
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "company_id")
    private long companyId;

    @Column(name = "company_region")
    private String companayRegion;

    @Column(name = "company_code")
    private String companyCode;

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
    private List<department> departments;


    public Company() {
    }
}




@Entity
@Table(name = "Department")
@Getter
@Setter
public class Department implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "dept_id")
    private long departmentID;

    @Column(name = "dep_code")
    private String departmentCode;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id")
    private Company company;

    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private List<Employee> employees;
}



@Entity
@Table(name = "Employee")
@Getter
@Setter
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private long employeeId;

    @Column(name = "emp_code")
    private String empCode;

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

    @Column(name = "employee_city")
    private String employeeCity;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dept_id")
    private Department department;
}

Ответы [ 2 ]

0 голосов
/ 16 января 2020
  1. Убедитесь, что ваш JSON содержит идентификатор компании / идентификатор отдела / идентификатор сотрудника
  2. Загрузить компанию по идентификатору компании
  3. ВСТАВИТЬ все записи отдела, где departmentID == 0, и получить сгенерированный идентификатор ( Hibernate обновит POJO или вернет новый с установленным идентификатором)
  4. ОБНОВИТ все записи отдела, где departmentID > 0, и запомните использованный идентификатор отдела
  5. Итерируйте по company.getDepartments() и iterator.remove() записи с DepartmentID, не содержащимися в коллекции, построенной из (3) и (4)
  6. При сохранении company Hibernate определит, какие отделы были удалены, и удалит эти

Сделайте в основном то же самое для отдела -> отношения с сотрудниками

0 голосов
/ 16 января 2020

сопоставления кажутся правильными, вам нужно использовать merge для получения объекта, управляемого Hibernate, и скопировать поля из отсоединенного экземпляра (поступающего из API REST):

Company c = (Company) session.merge(companyFromDto);

Слияние следует позаботиться о создании новой компании или обновлении существующей (в зависимости от того, находится ли она уже в БД), а также каскадных ассоциаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...