JPA2, как показать поля из таблицы A, таблицы C, если таблица A соединить с таблицей B, а затем соединить с таблицей C? - PullRequest
0 голосов
/ 07 марта 2012

Для каждого субъекта у меня есть объект A, скажем, с колонкой a1 (PK), a2. Сущность B, с колонкой a2 (PK), b1 Объект C, с колонкой b1 (PK), c1

Итак, A присоединяется к B с помощью a2, а затем присоединяется к C с помощью b1. (Все они относятся один к одному)

Эти сущности используются в веб-сервисе, когда при вызове генерирует файл XML, содержащий список этих сущностей. Теперь генерировать XML, объединяющий сущности A и B с полями a1, a2, a1, очень просто.

Но какой синтаксис / аннотации необходимы, если я хочу создать XML, который показывает только сущность A и сущность C? Я имею в виду, как мне настроить эту сущность А, чтобы она позволила этому случиться?

Я также решу, смогу ли я получить все поля от объекта 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      
}

сущность 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_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  
}

1 Ответ

0 голосов
/ 08 марта 2012

Согласно вашему рисунку, Table_B - это просто таблица соединения для A и C. Если вы настроите аннотацию OneToOne с JoinTable в MyComplex.java, то я считаю, что вы можете настроить отношения Table_A и Table_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;
/* ------------ */
}
...