Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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 JPA2如何显示表A、表C中的字段如果表A连接表B,则连接表C?_Java_Persistence_Jpa 2.0_Ejb 3.1 - Fatal编程技术网

Java JPA2如何显示表A、表C中的字段如果表A连接表B,则连接表C?

Java JPA2如何显示表A、表C中的字段如果表A连接表B,则连接表C?,java,persistence,jpa-2.0,ejb-3.1,Java,Persistence,Jpa 2.0,Ejb 3.1,对于每个主题,我有一个实体A,比如说a1列(PK),a2。 实体B,列a2(主键),b1 实体C,带b1列(主键),c1 所以A用a2连接到B,然后用b1连接到C (它们都是一对一的关系) 这些实体在Web服务中使用,当调用时将生成包含这些实体列表的XML文件。 现在生成一个结合实体a和B以及字段a1、a2、a1的XML非常简单 但是,如果我想生成只显示实体A和实体C的XML,那么需要什么语法/注释呢?我的意思是,如何设置实体A,使其允许这种情况发生 如果我能从实体A、B、C获得所有字段,我也会

对于每个主题,我有一个实体A,比如说a1列(PK),a2。 实体B,列a2(主键),b1 实体C,带b1列(主键),c1

所以A用a2连接到B,然后用b1连接到C (它们都是一对一的关系)

这些实体在Web服务中使用,当调用时将生成包含这些实体列表的XML文件。 现在生成一个结合实体a和B以及字段a1、a2、a1的XML非常简单

但是,如果我想生成只显示实体A和实体C的XML,那么需要什么语法/注释呢?我的意思是,如何设置实体A,使其允许这种情况发生

如果我能从实体A、B、C获得所有字段,我也会进行结算

我正在使用jpa2,ejb3.1

编辑:添加示例

实体A

@Entity
@Table(name = "TABLE_A")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "MyComplex.findAll", query = "SELECT j FROM MyComplex j"),
    @NamedQuery(name = "MyComplex.findA1", query = "SELECT j FROM MyComplex j WHERE j.a1 = :A1")
})
public class MyComplex implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "A1", length = 1)
    private String a1;

    @Column(name = "A2", length = 1)
    private String a2;

    public MyComplex() {
    }

    public MyComplex(String a1) {
        this.a1 = a1;
    }

    public String getA1() {
        return a1;
    }

    public void setA1(String a1) {
        this.a1 = a1;
    }

    public String getA2() {
        return a2;
    }

    public void setA2(String a2) {
        this.a2 = a2;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (a1 != null ? a1.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof MyComplex)) {
            return false;
        }
        MyComplex other = (MyComplex) object;
        if ((this.a1 == null && other.a1 != null) || (this.a1 != null && !this.a1.equals(other.a1))) {
            return false;
        }
        return true;
    }    
    @Override
    public String toString() {
        return "jpa.mypackage.Table_A[a1=" + a1 + " ]";
    }      
}
实体B

@Entity
@Table(name = "TABLE_B")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Table_B.findAll", query = "SELECT j FROM Table_B j"),
    @NamedQuery(name = "Table_B.findA2", query = "SELECT j FROM Table_B j WHERE j.a2 = :A2")
})
public class Table_B implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "A2", length = 1)
    private String a2;

    @Size(max = 1)
    @Column(name = "B1", length = 1)
    private String b1;

    //entity constructor here

    //entity get/set methods here

    //entity hash methods here      
}
@Entity
@Table(name = "TABLE_A")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "MyComplex.findAll", query = "SELECT j FROM MyComplex j"),
    @NamedQuery(name = "MyComplex.findA1", query = "SELECT j FROM MyComplex j WHERE j.a1 = :A1")
})
public class MyComplex implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "A1", length = 1)
    private String a1;

    @Column(name = "A2", length = 1)
    private String a2;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name="A2", referencedColumnName="A2")
    private Table_B table_B;

    //entity constructor here

    //entity get/set methods here
    public Table_B getTable_B() {
        return table_B;
    }

    public void setTable_B(Table_B table_B) {
        this.table_B = table_B;
    }    

    //entity hash methods here  
}
实体C

@Entity
@Table(name = "TABLE_C")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Table_C.findAll", query = "SELECT j FROM Table_C j"),
    @NamedQuery(name = "Table_C.findB1", query = "SELECT j FROM Table_C j WHERE j.b1 = :B1")
})
public class Table_C implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "B1", length = 1)
    private String b1;

    @Size(max = 1)
    @Column(name = "C1", length = 1)
    private String c1;

    //entity constructor here

    //entity get/set methods here

    //entity hash methods here      
}
修改实体A以加入实体B

@Entity
@Table(name = "TABLE_B")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Table_B.findAll", query = "SELECT j FROM Table_B j"),
    @NamedQuery(name = "Table_B.findA2", query = "SELECT j FROM Table_B j WHERE j.a2 = :A2")
})
public class Table_B implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "A2", length = 1)
    private String a2;

    @Size(max = 1)
    @Column(name = "B1", length = 1)
    private String b1;

    //entity constructor here

    //entity get/set methods here

    //entity hash methods here      
}
@Entity
@Table(name = "TABLE_A")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "MyComplex.findAll", query = "SELECT j FROM MyComplex j"),
    @NamedQuery(name = "MyComplex.findA1", query = "SELECT j FROM MyComplex j WHERE j.a1 = :A1")
})
public class MyComplex implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "A1", length = 1)
    private String a1;

    @Column(name = "A2", length = 1)
    private String a2;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name="A2", referencedColumnName="A2")
    private Table_B table_B;

    //entity constructor here

    //entity get/set methods here
    public Table_B getTable_B() {
        return table_B;
    }

    public void setTable_B(Table_B table_B) {
        this.table_B = table_B;
    }    

    //entity hash methods here  
}

根据您的图,我看到表B只是a和C的连接表。如果您在MyComplex.java中使用JoinTable设置OneTONE注释,那么我相信您可以设置表a和表C的关系

@Entity
@Table(name = "TABLE_A")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "MyComplex.findAll", query = "SELECT j FROM MyComplex j"),
    @NamedQuery(name = "MyComplex.findA1", query = "SELECT j FROM MyComplex j WHERE j.a1 = :A1")
})
public class MyComplex implements Serializable {
/* ------------------------------------ */
@OneToOne
@JoinTable(
        name="Table_B",
        joinColumns=
            @JoinColumn(name="A2", referencedColumnName="A2"),
        inverseJoinColumns=
            @JoinColumn(name="B1", referencedColumnName="B1")
    )
private Table_C tableC;
/* ------------ */
}

没有代码示例,很难给出准确的答案。我只能建议您创建一个只包含所需列的包装器实体,并填充这个(列表)包装器实体,然后将其提供给web-service@JScoobyCed您的意思是创建jpa本机查询(通过createNativeQuery),调用它并用所有字段填充包装器实体?我不能选择这种方式,因为实际实体链接到5-6个其他实体,总共有数百个字段。任何进一步的改变都将变得困难。更不用说本机查询将非常长且难以维护。谢谢,我最初测试了代码,但Netbean/eclipselink抱怨引用/映射“与映射引用上的有效字段不对应”。。。不知怎的,我用一个新名称复制了netbean项目,并重新部署到glassfish,但由于常见的内存问题而失败了。。。服务器重启后,我重新部署了项目,它成功地显示了所有需要的信息。我仍然不确定为什么同一代码最初失败并出现错误,但在服务器重新启动后成功…“引用/映射”与映射引用“”上的有效字段不对应?主要原因是persistences.xml中缺少或无效的实体定义