Prosty CRUD Foreign Key ON DELETE NullPointer

0

Witam,
piszę prostego CRUDa (SPRING MVC, MySQL, JPA), projekt ma dwa beany - user i termin. Beany są połączone relacją ManyToOne, fieldem 'username'. Jest opcja tworzenia nowych userów oraz usuwania istniejących. Chcę zachować wprowadzone terminy nawet jeśli user, który go dodał, zostanie usunięty. Dlatego ustawiłem w bazie danych foreign key ON DELETE na SET NULL (niestety nie ma opcji na SET DEFAULT, z tego co wyczytałem nie pozwala na to engine InnoDB). Wszystkie funkcjonalości akronimu CRUD działają poprawnie, problem pojawia się w chwili, kiedy chcę wyświetlić rekord z nullem w fieldzie 'username'.

Wyświetlam dane używając:
<c:out value="${termin.username}">

Pierwotnie myślałem, że załatwi sprawę wykorzystanie ternary operatora i taka linijka zrobi robotę:

<c:out value="${empty termin.username? 'brak' : termin.username}">

Jednak bardzo prędko konsola uświadomiła mi, jak bardzo się mylę wyrzucając NullPointera wskazując, jeśli dobrze rozumiem, że problem leży po stronie gettera.

Caused by: javax.el.ELException: Error reading 'username' on type com.marekmarek.timetable.daos.Termin
at javax.el.BeanELResolver.getValue(BeanELResolver.java:101)
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:46)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)

Caused by: java.lang.NullPointerException
at com.marekmarek.timetable.daos.Termin.getUsername(Termin.java:108)

Getter username klasy Termin, która ma field User wygląda następująco:

		return user.getUsername();
	}```

Konstruktor Terminu wygląda następująco:

```public Termin() {
		this.user = new User();
	}```

W związku z powyższym mam pytanie:
Lepiej rozwiązać sprawę w klasie, sprawdzając tego NULLa, jeśli tak, to gdzie i jak, czy może rozwiązać rzecz w ten sposób, iż stworzyć zapytanie z CASEm, które podmieni NULLa na wartość ustawioną w zapytaniu?

0

Ja bym to rozwiązał tak:

public String getUsername() { 
   if (user.getUsername() == null) {
       return "";
   }
   return user.getUsername();
}
1

Tak na marginesie - lepsze będzie utworzenie klucza na id użytkownika niż jego nazwę (większa wydajność oraz brak konieczności aktualizacji miliona tabel w przypadku zmiany nazwy usera).

0

@barkmar: ten kod, to było pierwsze, co wklepałem po zobaczeniu treści exceptiona. Te linijki kodu nie działają. Nie można wywołać metody "null.getUsername()".

Ahhh... od początku wiedziałem, że pomijam jakiś banał, stąd nawet nie chciałem prosić o pomoc tutaj, mimo to dziękuję za odpowiedzi.

Dla porządku:

		if(user == null){
			return "-";
		}
		return user.getUsername();
	}```

@Patryk27: Dzięki za wskazówkę, w drugim beanie wpierw też miałem PK na Stringu, ale zmieniłem na Longa dodając opcję edycji, w Userze dopiero muszę to nadgonić.

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