- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从 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_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 模型内部手动实现这些功能并手动操作它并不是一个好主意。
也许您会问为什么我需要这种接受 id 而不是实体的集合函数?我的程序读取一些模拟数据并尝试填充 MySQL 中的表。问题出在模拟数据中,我有 User
和 Form
实体的外键。它们已经存在于数据库中,我不需要再次创建它们。
最佳答案
您不能按原样在 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/
我是一名优秀的程序员,十分优秀!