gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:32:06 25 4
gpt4 key购买 nike

我从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com