Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个具体类使用hibernate继承表时创建别名时出错_Java_Hibernate_Polymorphism - Fatal编程技术网

Java 每个具体类使用hibernate继承表时创建别名时出错

Java 每个具体类使用hibernate继承表时创建别名时出错,java,hibernate,polymorphism,Java,Hibernate,Polymorphism,我有一个模型,在这个模型中,我实现了每个具体类的表。因此,我有一个抽象类,它在多个表中具有公共属性。我有以下实体 @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class BaseForm{ @Id @GeneratedValue(strategy = GenerationType.TABLE) protected Long id;

我有一个模型,在这个模型中,我实现了每个具体类的表。因此,我有一个抽象类,它在多个表中具有公共属性。我有以下实体

    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    public abstract class BaseForm{

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    protected Long id;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id=id;
    }

    @Column(name = "submission_date")
    protected Date submissionDate;

    public Date getSubmissionDate() {
        return submissionDate;
    }
    public void setSubmissionDate(Date submissionDate) {
        this.submissionDate=submissionDate;
    }

   }

@Entity
@Table(name = "form_a")
public class FormA extends BaseForm{

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "formA", fetch = FetchType.LAZY)
    @Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    @Fetch(FetchMode.SUBSELECT)
    @OrderBy("id")
    protected List<UserForm> userForms = new ArrayList<UserForm>();

}

@Entity
@Table(name = "form_b")
public class FormB extends BaseForm{

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "formB", fetch = FetchType.LAZY)
    @Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    @Fetch(FetchMode.SUBSELECT)
    @OrderBy("id")
    protected List<UserForm> userForms = new ArrayList<UserForm>();

}

@Entity
@Table(name = "user_form")
public class UserForm {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    public Long getId() {
        return id;
    }

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

    @ManyToOne(optional = true)
    protected FormA formA;

    @ManyToOne(optional = true)
    protected FormB formB;

    @ManyToOne(optional = true)
    protected User user;    
下面是生成的hibernate查询

SELECT COUNT(*) AS y0_
FROM
  (SELECT id,
    submissionDate,  
    1 AS clazz_
  FROM form_a
  UNION
  SELECT id,
    submissionDate,  
    2 AS clazz_
  FROM form_b
  ) this_
INNER JOIN user_form userforms1_
ON this_.id=userforms1_.formA_id
INNER JOIN user_form userforms1_
ON this_.id=userforms1_.formB_id
WHERE (userforms1_.formA IS NOT NULL
OR userforms1_.formB IS NOT NULL)

你知道会有什么问题吗。如何解决这个问题?

您使用超类别名访问子类字段,这在概念上是错误的(虽然在某些情况下有效,但显然并不总是如此)

您应该考虑将<代码>用户窗体< /代码>转换为基类,或者将查询转换为类似的内容(JPQL,将其转换成等价的标准):


您使用超类别名访问子类字段,这在概念上是错误的(虽然在某些情况下有效,但显然并不总是如此)

您应该考虑将<代码>用户窗体< /代码>转换为基类,或者将查询转换为类似的内容(JPQL,将其转换成等价的标准):


谢谢你抽出时间回答我的问题。但实际上,hql并不能解决这个问题,因为FormA和FormB每个人都有自己的id序列。所以我们有可能在形式上有ID10,在形式上有另一个ID10。在这种情况下,恐怕你们会遇到比这更大的问题。以下操作的预期结果是什么:
entityManager.find(BaseForm.class,10)
(或Hibernate
会话的等效操作
)?我知道@GeneratedValue(strategy=GenerationType.TABLE)将处理所有实体中ID的唯一性。感谢您抽出时间回答我的问题。但实际上,hql并不能解决这个问题,因为FormA和FormB每个人都有自己的id序列。所以我们有可能在形式上有ID10,在形式上有另一个ID10。在这种情况下,恐怕你们会遇到比这更大的问题。以下操作的预期结果是什么:
entityManager.find(BaseForm.class,10)
(或使用Hibernate
会话的等效操作
)?我知道@GeneratedValue(strategy=GenerationType.TABLE)将处理所有实体中ID的唯一性。
SELECT COUNT(*) AS y0_
FROM
  (SELECT id,
    submissionDate,  
    1 AS clazz_
  FROM form_a
  UNION
  SELECT id,
    submissionDate,  
    2 AS clazz_
  FROM form_b
  ) this_
INNER JOIN user_form userforms1_
ON this_.id=userforms1_.formA_id
INNER JOIN user_form userforms1_
ON this_.id=userforms1_.formB_id
WHERE (userforms1_.formA IS NOT NULL
OR userforms1_.formB IS NOT NULL)
select bf from BaseForm bf 
  where bf.id in (select fa.id from FormA fa join fa.userForms)
     or bf.id in (select fb.id from FormB fb join fb.userForms)