Использование существующей записи родительского класса в Spring JPA / Java - PullRequest
0 голосов
/ 05 июня 2018

Я разрабатываю решение, и в определенной ситуации у меня есть класс под названием Cliente, как следует

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Cliente implements Serializable{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String nome;
private String email;

@ElementCollection
@CollectionTable(name="TELEFONE")
private Set<String> telefones = new HashSet<>();

public Cliente() {}

//getters and setters
}

И у меня есть класс Funcionario, который расширяет класс Cliente, следующим образом.

@Entity
public class Funcionario extends Cliente{
private static final long serialVersionUID = 1L;

private String cpf;
private String cargo;
private Double salario;
private String login;
private String senha;
private String perfil;

public Funcionario() {}

public Funcionario(Integer id, String nome, String email, String cpf, String cargo, Double salario, String login, String senha, String perfil) {
    super(id, nome, email);
    this.cpf = cpf;
    this.cargo = cargo;
    this.salario = salario;
    this.login = login;
    this.senha = senha;
    this.perfil = perfil;
}

//getters and setter
}

В моей базе данных у меня две таблицы при запуске приложения.Таблица Funcionario и таблица Cliente.А в таблице Funcionario у меня есть поле под названием «Id», которое связывает запись в Funcionario с записью в Cliente.

Поля таблицы Cliente

Поля таблицы Funcionario

Когда мне нужно сохранить запись в классе Funcionario, мне нужно передать параметры "Id", "Nome" и "Email" в суперконструктор и новыйзапись в таблице Funcionario и таблице Cliente создана.

Пока что кажется, что все работает хорошо, но через некоторое время мне нужно будет использовать существующую запись класса Cliente.Другими словами, мне нужно будет вставить новую запись в таблицу Funcionario, но мне нужно использовать запись, которая уже существует в таблице Cliente.

Я много искал, но не нашел ничего полезного, чтобысделай это.Вы знаете, как я могу решить эту проблему?

Спасибо, большое!

1 Ответ

0 голосов
/ 05 июня 2018

Я не думаю, что это будет работать с JPA, потому что это действительно противоречит тому, как наследование работает в Java.Вам придется загрузить экземпляр Cliente и затем каким-то образом превратить его в экземпляр Funcionario.

Я вижу два возможных подхода к решению проблемы.

  1. Хакерский способ: используйте оператор вставки для создания фиктивных данных в таблице Funcionario. После , который загружает объект, и он должен выглядеть как Funcionario

  2. Чистый способ: изменить вашу объектную модель.Funcionario не должен расширять Cliente, но вместо этого Funcionario должен быть необязательной ссылкой "один к одному" в Cliente.Вероятно, было бы неплохо переименовать его в испанский (?) Эквивалент FuncionarioRole, чтобы Cliente мог иметь FuncionarioRole.Таким образом, изменение Functionario просто добавляет ссылку.Если вы разделяете идентификатор, из двух сущностей он может даже совпадать с одной и той же схемой базы данных.

...