Problem z metodą zwracającą wszystkie encje z bazy danych

0

Hej,

Przeorganizowałem trochę kod mojej aplikacji CRUD, którą tworzę w celach edukacyjnych. Wcześniej miałem metodę pozyskującą wszystkie encje z bazy, która niczego nie zwracała, tylko od razu wypisywała na konsolę te encje i wszystko działało (dodam, że session.createQuery miało dokładnie taki sam parametr, więc nie jest to chyba wina błędnego zapytania do SQL). Postanowiłem zmienić tę metodę tak aby zwracała listę wyników w celu dalszego testowania i rozbudowy programu. Teraz podczas wywoływania tej metody dostaję error:

Error performing load command : org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [domain.Email#103]

Dodam, że kiedy wywołuję metodę zwracającą encję po id to wszystko działa ok, dlatego przypuszczam, że nie jest to problem z bazą danych ani z encjami.

Wspomniana metoda:


public static List<Contact> listAllContacts(){

        List<Contact> listContact = new ArrayList<Contact>();

        Session session = null;
        try {
            session = HibernateUtils.openSession();
            listContact = session.createQuery("SELECT c FROM Contact c").getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return listContact;
    }

Kontroler, który ją wywołuje:


 public void getAllContacts(){

        List<Contact> allContacts = ContactRepository.listAllContacts();

        if (allContacts == null) {
            System.out.println("No contact found. ");
        } else {
            for (Contact contact : allContacts) {
                System.out.println(contact.toString());
            }
        }
    }

pełen kod tutaj

1

Wygląda tak, jakbyś miał w tabeli contacts wiersz, który jest powiązany z emailem o ID = 103, a nie miał takiego wiersza w tabeli emails. Używasz w tym projekcie specyficznej bazy danych, w której, zdaje się, pilnowanie więzów integralności (czyli właśnie niedopuszczanie do takiej sytuacji) jest opcją, nie standardem. Może masz tę opcję wyłączoną.

0

Faktycznie jest tak jak mówisz, mam kontakt o id 102, który ma przypisanego maila o id 103, którego nie ma. Nie mam pojęcia dlaczego tak się stało. W tym projekcie używam SQLite'a. W jaki sposób mógłbym wyłączyć pilnowanie integralności? Nie mam nic przeciwko, żeby w takiej sytuacji email po prostu się nie zmapował na obiekt, lub został zastąpiony nullem.

0

Mówiąc "pilnowanie więzów integralności" miałem na myśli mechanizm bazy danych, który nie pozwoliłby na to, żeby klucz obcy (bo zakładam, że id maila w tabeli contacts jest kluczem obcym do tabeli emails) miał wartość, której nie ma w kluczu głównym tabeli, do której się odnosi (emails). Do takiej niespójności mógłbyś dojść (i najwyraźniej doszedłeś) albo wstawiając taki zepsuty wiersz do contacts, albo usuwając wiersz o id=103 z emails. Gdybyś więzy integralności były pilnowane, baza danych rzuciłaby błędem przy każdej z tych operacji.

Jeśli chodzi o to, żeby zostawić taki bałagan w bazie, a tylko zmusić Hibernate do radzenia sobie z nim - nie wiem, nigdy takiego czegoś nie widziałem, wątpię żeby to było możliwe, bo chyba nie jest sensowne. Proponuję zrobić porządek z bazą danych i włączyć te więzy: https://www.sqlite.org/foreignkeys.html.

1 użytkowników online, w tym zalogowanych: 0, gości: 1