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?