代码之家  ›  专栏  ›  技术社区  ›  MJBZA

强制JPA接受外键,而不仅仅是实体

  •  0
  • MJBZA  · 技术社区  · 5 年前

    我从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;
        }
    
    }
    

    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模型中手动实现这些函数并手动操作可能不是一个好主意。

    也许你会问,为什么我需要这种接受ID而不是实体的集合函数? User Form 实体。它们已经存在于数据库中,我不需要再次创建它们。

    0 回复  |  直到 5 年前
        1
  •  0
  •   zlaval    5 年前

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

    编辑: 创建一个类,例如FormService。在那里,您可以创建一个方法并使用Spring数据JPA、JpaTemplate、普通JPA或其他方法来检索表单。

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

    然后将其设置为调查。

    survay.setForm(form);
    

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

    session.merge(survay);