Можем ли мы вставить / обновить несколько таблиц, используя Hibernate - PullRequest
0 голосов
/ 29 апреля 2020

Я создал базу данных, используя JPA и Hibernate. Существует таблица CHECKPOINT, которая имеет четыре внешних ключа, что означает, что она связана с 4 различными таблицами отношением один к одному.
Есть ли способ вставить / обновить данные в других четырех таблицах без написания отдельного запроса для каждого из них? и получить все четыре внешних ключа для моей таблицы контрольных точек всякий раз, когда я вставляю или обновляю данные в таблице CHECKPOINT?

1 Ответ

0 голосов
/ 29 апреля 2020

Jpa и Hibernate являются ORMS, что означает, что вы чувствуете и работаете с объектами, а не с самой базой данных. В случае вашего вопроса, да, это возможно. рассмотрим этот пример:

@Entity(name = "ForeignKeyAssAccountEntity")
@Table(name = "ACCOUNT", uniqueConstraints = {
        @UniqueConstraint(columnNames = "ID")})
public class AccountEntity implements Serializable 
{

    private static final long serialVersionUID = -6790693372846798580L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    private Integer accountId;

    @OneToOne(mappedBy="account")
    private EmployeeEntity employee;

    @Column(name = "ACC_NUMBER", unique = true, nullable = false, length = 100)
    private String accountNumber;

    public Integer getAccountId() {
        return accountId;
    }

    public void setAccountId(Integer accountId) {
        this.accountId = accountId;
    }

    public EmployeeEntity getEmployee() {
        return employee;
    }

    public void setEmployee(EmployeeEntity employee) {
        this.employee = employee;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }
}

и объект сотрудника:

@Entity(name = "ForeignKeyAssEmployeeEntity")
@Table(name = "Employee", uniqueConstraints = {
        @UniqueConstraint(columnNames = "ID"),
        @UniqueConstraint(columnNames = "EMAIL") })
public class EmployeeEntity implements Serializable {

    private static final long serialVersionUID = -1798070786993154676L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    private Integer employeeId;

    @Column(name = "EMAIL", unique = true, nullable = false, length = 100)
    private String email;

    @Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
    private String firstName;

    @Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
    private String lastName;

    @OneToOne
    @JoinColumn(name="ACCOUNT_ID")
    private AccountEntity account;

    public Integer getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(Integer employeeId) {
        this.employeeId = employeeId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public AccountEntity getAccount() {
        return account;
    }

    public void setAccount(AccountEntity account) {
        this.account = account;
    }
}

* Хочу отметить, что это отношение один к одному. Теперь, как вы можете видеть, это две отдельные таблицы со связями. Теперь я могу использовать hibernate, получить доступ к обеим этим таблицам и внести изменения, после чего hibernate сопоставит все, что я сделал с базой данных. Представьте, что учетная запись с идентификатором Id = 1 находится в отношениях один к одному с сотрудником с идентификатором Id = 1:

@Transactional
public void testUpdates(){
    Account account=entityManager.loadById(Account.class,1);
    account.setAccountNumber("123456");//setting a new number!
    account.getEmployee().setFirstName("a new name!");
}

. Таким образом, приведенный выше код позволяет изменять или обновлять две таблицы, поэтому нет необходимости писать дополнительный код или! вам даже не нужно вызывать функцию сохранения в учетной записи или связанном с ней сотруднике из-за управляемого состояния объекта. Я предлагаю вам посмотреть несколько небольших примеров, используя JPA / Hibernate, и вы увидите, как это сделать, что вы думаете. Начало здесь .

...