-2

データベースから出力テキストフィールドにレコードの一覧を表示したい。データベースからレコードを取得する方法に問題があります。マネージド Bean クラスのコンストラクターで呼び出しているため、無限ループが発生しています。これがコードです。

マネージド Bean クラスのコンストラクター:

public InterViewDto() throws SQLException {

        User u = getCurrentUser();
        InterviewDao d = new InterviewDao();
        List<InterViewDto> dao1 = d.getCall(u.getEmailAddress());
        setDto(dao1);

    }  

データベースからレコードを取得するメソッド:

public List<InterViewDto> getCall(String email) throws SQLException {
        System.out.print("fyc");
         List<InterViewDto> list = new ArrayList<InterViewDto>();

        String job = null;
        boolean exists = false;

        Connection c = null;
        try {

            c = openConnection();

            String query_check = "SELECT *  FROM interviewcall WHERE useremail = '"+email+"' ";
            Statement st = c.createStatement();
            ResultSet rs = st.executeQuery(query_check);

            while (rs.next()) {

                InterViewDto dto = new InterViewDto();
                dto.setDate( rs.getDate("time"));
                dto.setJobtitle( rs.getString("jobtitle"));
                dto.setJobtitle( rs.getString("useremail"));
                list.add(dto);
                System.out.print(list.get(0).getJobtitle());

            }       rs.close();

        } catch (Exception e) {
            System.out.println(e);

        } finally {
            c.close();
        }
        return list;
    }
4

1 に答える 1

0

循環依存関係があります。DTO のコンストラクターはデータベースに到達し、データベースからロードされたデータを表す新しい DTO を作成します。これは、コール スタックがオーバーフローするまで、データベースを行き来します。

簡単に言えば、2 つの補完的な設計アプローチを統合したことになります。

InterViewDto コンストラクターが DAO からデータを読み込むか、DAO が新しい InterViewDto オブジェクトを構築します。どちらかを選んでください。

私の意見では、DAO が DTO オブジェクトを作成する方が理にかなっています。便宜上、DTO を DAO に委任する場合は、静的メソッドを検討してください。

public class InterViewDto {
    public InterViewDto() {
    }

    ...

    public static fromCurrentUser() {
        return new InterviewDao().getCall(getCurrentUser().getEmailAddress());
    }
}

次に、コンストラクターを空に変更します。

于 2013-03-17T15:35:37.397 に答える