Wie verwende ich die Tabellen-pro-Klasse-Vererbung für abstrakte Elemente mit Hibernate und behebe Typzuordnungsprobleme
Posted: 17 Jan 2025, 09:04
Ich versuche, eine Vererbungsstruktur in meinem Projekt zu implementieren, in der ich eine abstrakte Item-Klasse mit mehreren konkreten Unterklassen wie ColletItem, DeviceItem und HolderItem habe. Mein Ziel ist es, in Zukunft zusätzliche Elementtypen zu unterstützen und gleichzeitig die Klasse Item abstrakt zu halten.
Hier ist die Struktur meiner Entitäten:
Abstract Item-Klasse
Beispielunterklasse: DeviceItem
Beispielunterklasse: ColletItem
-Entität
-Entität
Wenn ich versuche, ItemCombination-Entitäten abzurufen, erhalte ich die folgende Fehlermeldung:
Es scheint, dass Hibernate die abstrakte Item-Klasse nicht richtig zuordnen kann. Ich vermute, das liegt an der Art und Weise, wie die Vererbung eingerichtet ist, oder an der Zuordnung von @ManyToOne zu bestimmten Unterklassen.
Meine Ziele:
Element behalten< /code> abstract, da ich vorhabe, in Zukunft weitere Unterklassen hinzuzufügen und eine Tabelle-pro-Klasse-Strategie zu verwenden, um eine saubere Trennung für jeden Elementtyp aufrechtzuerhalten und keine Nullwerte zu haben.
Wie kann ich Hibernate für die Verwendung von a konfigurieren? Tabelle-pro-Klasse-Strategie für diese Vererbungsstruktur?
PS: Mir ist bewusst, dass ich den Typ in der ItemCombination einfach Item haben könnte, aber Dadurch wäre es nicht möglich, die Artikelkennung vom jeweiligen Kind abzurufen. Selbst mit der Instanz von würde es mit keinem übereinstimmen.
Hier ist die Struktur meiner Entitäten:
Abstract Item-Klasse
Code: Select all
@MappedSuperclass
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "common_attribute", nullable = true)
private String commonAttribute;
}
Code: Select all
@Entity
@Table(name = "device_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeviceItem extends Item {
@Column(name = "serial_number", length = 255, nullable = false)
private String serialNumber;
}
Code: Select all
@Entity
@Table(name = "collet_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ColletItem extends Item {
@Column(name = "item_identifier", length = 255, nullable = false)
private String itemIdentifier;
}
Code: Select all
ClampingDeviceItem
Code: Select all
package ch.rfag.Model;
import jakarta.persistence.*;
import lombok.*;
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "clamping_device_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClampingDeviceItem extends Item {
@Column(name = "item_identifier", length = 255, nullable = false, unique = true)
private String itemIdentifier;
}
Code: Select all
ItemCombination
Code: Select all
@Entity
@Table(name = "item_combination")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ItemCombination {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "collet_item_id_fk", nullable = true)
private ColletItem colletItem;
@ManyToOne
@JoinColumn(name = "holder_item_id_fk", nullable = true)
private HolderItem holderItem;
@ManyToOne
@JoinColumn(name = "clamping_item_id_fk", nullable = true)
private ClampingDeviceItem clampingDeviceItem;
}
Code: Select all
Caused by: java.lang.IllegalArgumentException: Cannot set ch.rfag.Model.ClampingDeviceItem field ch.rfag.Model.ItemCombination.clampingDeviceItem to ch.rfag.Model.DeviceItem
Meine Ziele:
Element behalten< /code> abstract, da ich vorhabe, in Zukunft weitere Unterklassen hinzuzufügen und eine Tabelle-pro-Klasse-Strategie zu verwenden, um eine saubere Trennung für jeden Elementtyp aufrechtzuerhalten und keine Nullwerte zu haben.
Wie kann ich Hibernate für die Verwendung von a konfigurieren? Tabelle-pro-Klasse-Strategie für diese Vererbungsstruktur?
PS: Mir ist bewusst, dass ich den Typ in der ItemCombination einfach Item haben könnte, aber Dadurch wäre es nicht möglich, die Artikelkennung vom jeweiligen Kind abzurufen. Selbst mit der Instanz von würde es mit keinem übereinstimmen.