Zu viel Ableitung, JPA kaputt?

  • Themenstarter Gelöschtes Mitglied 68249
  • Beginndatum
G

Gelöschtes Mitglied 68249

Gast
Hi,

ich habe hier gerade geistig ein Problem mit meinem Konstrukt, dass ich aufgebaut habe und jetzt wirft mir JPA berechtigt Fehler vor, die ich aber gerne gelöst bekommen hätte.

Folgendes Szenario:
In Java:
Es gibt die Klasse WIndowsOs, die repräsentiert einen Host mit allen Attributen, die ich auf dieser Ebene brauche. Eines dieser Attribute ist die Entität Server, diese repräsentiert den Server, auf dem der Host läuft, diese ist aber quasi nur ein Kopf. Darunter befinden sich dann verschiedene Klassen von Servern mit ihren eigenen Java-Klassen, also virtuelle Server, Blade-Server, Rack-Server, Blade-Center. Diese haben aber alle eine Parent-Klasse "Server-Main" da drin sind solche Felder, wie Kommentar, Beschreibung, Betreiber, die einfach jede Art von Servern hat.

Auf der Datenbank habe ich folgendes Szenario:
Eine Tabelle für die WindowsOs, eine Tabelle für Server und jeweils eine Tabelle für jede Server-Klasse. Idee von mir war, dass ich bei den Serverklassen dann jeweils eine Tabelle habe, in der für jeden Datensatz nahezu alle Felder gefüllt sind und ich keinen Overhead von leeren Feldern habe, bzw. Spalten nicht irgendwelche Kryptischen Namen geben muss, damit ich eine Doppelverwendung benennen kann.

Im Code wollte ich jetzt folgendes haben:
Java:
@Entity
@Table
public class Server {

    @Id
    @Column(name = "UUID",length = 36)
    private String pk;
    
    @Column(name = "SERVER_TYPE",length = 100)
    @Enumerated(EnumType.STRING)
    private ServerType typ;

    @OneToMany(mappedBy = "server")
    private Set<? extends ServerMain> timeslices;
    
    public ServerMain getCurrentServer() {
        Optional<? extends ServerMain> current;
        
        List<? extends ServerMain> tempList = new ArrayList<>(timeslices);

        if(timeslices.size() == 1) {
            return tempList.get(0);
        }
 
        Comparator<ServerMain> getActual;
        getActual =  new Comparator<ServerMain>() {
            @Override
            public int compare(ServerMain i1, ServerMain i2) {
                if(i1.getValidDate().isAfter(LocalDateTime.now())) return -1;
                if(i2.getValidDate().isAfter(LocalDateTime.now())) return 1;
                if(i1.getValidDate().isAfter(i2.getValidDate())) return 1;
                if(i2.getValidDate().isAfter(i1.getValidDate())) return -1;
                return 0;
            }
        };
        
        current = tempList.stream().max(getActual);
        
        if(current.isPresent()) {
            return current.get();
        }
        
        return null;
    }
    
    //GETTER und SETTER
}

Jetzt meckert JPA zurecht:
Code:
Beschreibung der Ausnahme: [class main.java.proips.persistence.entities.Server] verwendet eine Nicht-Entität [class main.java.proips.persistence.entities.pattern.ServerMain] als Zielentität im Beziehungsattribut [field timeslices].

Wie kann ich das so umstrukturieren, dass es gehen würde.

Bzw. welche Informationen braucht ihr noch, um das Problem zu verstehen?
 

mihe7

Top Contributor
private Set<? extends ServerMain> timeslices;
Das willst Du in der Regel nicht: timeslices ist damit ein Set eines bestimmten, aber unbekannten Typs, der von ServerMain erbt. D. h. Du könntest z. B. ein Set<SpecialServerMain> der Variablen timeslices zuordnen. Du könntest über timeslices iterieren und würdest zur Übersetzungszeit mit ServerMain arbeiten können. Aber Du kannst in Deiner Klasse der Collection z. B. nichts hinzufügen, da der Typ nicht bekannt ist.

Java:
private Set<ServerMain> timeslices;
sollte passen.
 

Ähnliche Java Themen

Neue Themen


Oben