Próbuję zrozumieć, w jaki sposób dziedziczenie działa w grze! Ale bezskutecznie jeszcze.Jak odziedziczyć model z nadklasy w strukturze Playframework
Tak, mam takie superklasę:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract class SuperClass extends Model {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_TABLE")
@TableGenerator(name = "SEQ_TABLE")
Long id;
int testVal;
}
oraz 2 dziedziczone klasy:
@Entity
public class Sub extends SuperClass {
String name;
@Override
public String toString() {
return name;
}
}
@Entity
public class Sub1 extends SuperClass {
String name;
@Override
public String toString() {
return name;
}
}
Również mam 2 kontrolerów dziedzicznych klas:
public class Subs and Sub1s extends CRUD {
}
Po zgłoszenie zostało rozpoczęte , Otrzymuję 2 tabele w MySQL db dla moich modeli (Sub i Sub1) o takiej strukturze: id bigint (20), nazwa varchar (255). Bez testu testVal, który znajduje się w nadklasie.
I gdy próbuję utworzyć nowy obiekt Sub klasy w interfejsie CRUD I odbieranie taki błąd: błąd Wykonanie wystąpił w szablonie {moduł: CRUD} /app/views/tags/crud/form.html. Podniesiono wyjątek: MissingPropertyException: Brak takiej właściwości: testVal dla klasy: models.Sub.
w {modułu: CRUD} /app/views/tags/crud/form.html (64) wokół linii # {crud.numberField nazwisko: field.name, wartość: (currentObject currentObject [pola .name]: null) /}
- Co należy zrobić, aby wygenerować tabel MySQL do odziedziczonych modeli prawidłowo i naprawić ten błąd?
- Czy jest możliwe posiadanie jednego superControllera dla kilku dziedziczonych klas?
Pamiętaj, że deklarujesz swoje pola za pomocą domyślnego modyfikatora dostępu. Zmień to na publiczne, aby gra PropertiesEnhaner mogła wykonać swoją pracę. – sdespolit
Dziękuję. Dodałem publiczny dostęp do 'Long id' i' int testVal'. Teraz widzę pole testVal w interfejsie CRUD i mogę zapisać model bez błędów. Ale wciąż nie ma takiego pola w MySql, więc nie mogę zapisać tej wartości. Uważam, że powinienem dodać jakąś adnotację do tej wartości, ale co? – gl0om
Wreszcie znalazłem rozwiązanie: Właśnie dodałem '@ MappedSuperclass' do' SuperClass' i usunąłem 'Long id' z niego. ** sdespolit **, jak zaakceptować sugestię dodania środka pośredniczącego do dostępu publicznego? Nie mogę znaleźć przycisku akceptacji. – gl0om