Заставить JPA принимать значение внешних ключей, а не только сущности - PullRequest
0 голосов
/ 26 мая 2020

Я импортировал некоторые классы модели JPA из схемы MySQL.

Вот один из примеров классов, которые автоматически генерируются JPA:


import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;


/**
 * The persistent class for the surveys database table.
 * 
 */
@Entity
@Table(name="surveys")
@NamedQuery(name="Survey.findAll", query="SELECT s FROM Survey s")
public class Survey implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(unique=true, nullable=false)
    private int id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="done_at")
    private Date doneAt;

    //bi-directional many-to-one association to Form
    @ManyToOne
    @JoinColumn(name="form_id", nullable=false)
    private Form form;

    //bi-directional many-to-one association to User
    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    private User user;

    public Survey() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDoneAt() {
        return this.doneAt;
    }

    public void setDoneAt(Date doneAt) {
        this.doneAt = doneAt;
    }

    public Form getForm() {
        return this.form;
    }

    public void setForm(Form form) {
        this.form = form;
    }

    public User getUser() {
        return this.user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

Проблема этой модели JPA в том, что она просто принимает сущности для внешних ключей. Я имею в виду, что здесь у меня есть внешние ключи form_id и user_id! Однако у меня нет каких-либо установленных функций, например следующих:

public void setForm(int formId) {
    Form form = find from table forms with id equal to formId; 
    this.form = form;
}

or 

public void setForm(int formId) {
    this.formId = formId;
}

Как я могу заставить JPA генерировать такие функции также, когда он пытается импортировать схему!?

Если это невозможно, каковы лучшие практики для расширения класса модели JPA? Я имею в виду, что это может произойти в будущем при изменении схемы базы данных. Мне нужно импортировать модели JPA опять же, может быть, не стоит реализовывать эти функции вручную внутри модели JPA и манипулировать ею вручную. объектов? Моя программа считывает некоторые фиктивные данные и пытается заполнить таблицы в MySQL. Проблема в фиктивных данных. У меня есть внешний ключ сущностей User и Form. Они уже существуют в БД, и мне не нужно создавать их снова.

1 Ответ

0 голосов
/ 26 мая 2020

Вы не можете использовать FK в JPA как есть. Вы можете использовать JPQL / SQL для обновления поля данной строки с помощью FK или вы можете создать класс обслуживания, в котором вы загружаете форму по идентификатору, а затем устанавливаете его для данного опроса. Вам следует избегать расширения автоматически сгенерированного класса (а также его принципа Open-Close).

Изменить: создать класс, например FormService. Там вы можете создать метод и использовать Spring Data JPA, JpaTemplate, Plain JPA или другие методы для получения формы. Например, со спящим режимом:

Form form = session.load(Form.class, id);

Затем вы устанавливаете это в Survey.

survay.setForm(form);

А теперь просто сохраните его обратно (сохраните, если это новый опрос, или объедините, если нет ).

session.merge(survay);

Если вы используете Spring, может быть проще и лучше использовать Data Jpa или JpaTemplate, но предыдущий вариант будет работать с Hibernate (и другими реализациями JPA) в любой среде java.

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