java - 强制 JPA 接受外键值而不仅仅是实体

标签 java mysql spring jpa

我从 MySQL 模式导入了一些 JPA 模型类。

这是 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_iduser_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 模型内部手动实现这些功能并手动操作它并不是一个好主意。

也许您会问为什么我需要这种接受 id 而不是实体的集合函数? 我的程序读取一些模拟数据并尝试填充 MySQL 中的表。问题出在模拟数据中,我有 UserForm 实体的外键。它们已经存在于数据库中,我不需要再次创建它们。

最佳答案

您不能按原样在 JPA 中使用 FK-s。您可以使用 JPQL/SQL 使用 FK 更新给定行的字段,也可以创建一个服务类,在其中按 id 加载表单,然后将其设置为给定的调查。 您应该避免扩展自动生成的类(及其反开闭原则)。

编辑: 创建一个类,例如 FormService。您可以在其中创建一个方法并使用 Spring Data JPA、JpaTemplate、Plain JPA 或其他方法来检索表单。 例如,使用 hibernate :

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

然后将其设置为调查。

survay.setForm(form);

现在只需将其保存回来(如果是新调查则保留,如果不是则合并)。

session.merge(survay);

如果您使用 Spring,那么使用 Data Jpa 或 JpaTemplate 可能会更容易、更好,但前一个可以在任何 java 环境中与 Hibernate(和其他 JPA 实现)一起使用。

关于java - 强制 JPA 接受外键值而不仅仅是实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62020221/

相关文章:

java - 解析节点内具有相同属性的 XML 文件

php - 如何在 PALM webOS 中连接到外部数据库(例如 MySQL)

java - 为什么会出现这个未处理的 org.apache.tiles.impl.CannotRenderException?

spring - Spring Web Flux(响应式(Reactive))功能路由与Kotlin一起无法正常工作

java - IOException 未捕获

java - 如何创建一个简单的json结果集?

java - 我想在变量中存储 0 到 100 之间的数字 - 我应该使用 INT 还是 BYTE,为什么?

c# - Asp.net C# 在数据插入数据库时​​显示捕获错误

mysql - Mysql插入一行后输出主键

java - csv 中不显示中文文本