1

まず、私の下手な英語で申し訳ありません。

私は Java プログラマーですが、Hibernate を扱う十分な経験がありません。オフィスではいくつかの新しい技術を学ぼうとしているので、Hibernate を使用してデータベースの問題を解決しようとしています。

Processamento と呼ばれるクラスと Fila と呼ばれるクラスの 2 つのクラスがあります。

テーブル processamento には、fila.id で定義された 1 つのレジストリが Fila にあります。

プロセスクラス

@Entity
@Table(name="ra_fila_processamento", schema = "processamento")
public class Processamento implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private int idProcessamento;
    private int idFila;
    private int idServidor;

    private Fila fila;

    @Column(name="rfp_id")
    public int getIdProcessamento() {
        return idProcessamento;
    }

    public void setIdProcessamento(int idProcessamento) {
        this.idProcessamento = idProcessamento;
    }

    @Id
    @Column(name="rfp_rf_id")
    public int getIdFila() {
        return idFila;
    }

    public void setIdFila(int idFila) {
        this.idFila = idFila;
    }

    @Column(name="rfp_ser_id")
    public int getIdServidor() {
        return idServidor;
    }

    public void setIdServidor(int idServidor) {
        this.idServidor = idServidor;
    }

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name="ra_fila", schema="processamento", joinColumns = {@JoinColumn(name="rf_id", unique = true)})
    public Fila getFila() {
        return fila;
    }

    public void setFila(Fila fila) {
        this.fila = fila;
    }

}

フィラクラス

@Entity
@Table(name="ra_fila", schema="processamento")
public class Fila implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    public Fila() {}

    private int idFila;
    private String arquivoFonte;
    private String status;

    @Id
    @Column(name = "rf_id", unique = true, nullable = false)
    @GeneratedValue
    public int getIdFila() {
        return idFila;
    }

    public void setIdFila(int idFila) {
        this.idFila = idFila;
    }

    @Column(name="rf_arquivo_fonte")
    public String getArquivoFonte() {
        return arquivoFonte;
    }

    public void setArquivoFonte(String arquivoFonte) {
        this.arquivoFonte = arquivoFonte;
    }

    @Column(name="rf_status")
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

問題は、このコードを実行したときです。

    Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();

    try {

        Query query = session.createQuery("from Processamento");

        @SuppressWarnings("unchecked")
        List<Fila> fila = query.list();

        session.getTransaction().commit();

        if (fila.size() == 0) return false;

    } catch (HibernateException e) {
        e.printStackTrace();
    } finally {
        session.flush();
        session.close();
}

作成される HQL は次のとおりです。

select processame0_.rfp_rf_id as rfp1_3_, processame0_.rfp_id as rfp2_3_, processame0_.rfp_ser_id as rfp3_3_, processame0_1_.fila_rf_id as fila4_2_ from processamento.ra_fila_processamento processame0_ left outer join processamento.ra_fila processame0_1_ on processame0_.rfp_rf_id=processame0_1_.rf_id

この HQL のエラーは次の部分です。

processame0_1_.fila_rf_id as fila4_2_

このfila_はそこにあるべきではありません。どうすればこの関係 OneToOne を正しく行うことができますか? Processamento 列を Fetch して Fila を取得したいだけです。Processamento の Fila での結果は 1 つだけです。

ありがとう。

よろしくお願いします。

[解決済み]

主な誤りは、JoinTable を使用してはならないということでした。JoinTable はユニオン句のようなものだと思います。JoinTable を削除し、JoinColumn 句を追加すると問題が解決し、選択によって別の選択がトリガーされ、関係が存在する可能性があります。

4

1 に答える 1

0

Processamento のクエリを作成しましList<Fila>たが、これをフェッチしても問題ありません。

Query query = session.createQuery("from Processamento");
List<Processamento> processamentos = query.list();

for(Processamento processamento: processamentos){
   System.out.println(processamento.getFila().getIdFila();
}
于 2012-04-27T16:03:55.593 に答える