Вот структура моих объектов:
Класс Abstract Item
Код: Выделить всё
@MappedSuperclass
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "common_attribute", nullable = true)
private String commonAttribute;
}
Код: Выделить всё
@Entity
@Table(name = "device_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeviceItem extends Item {
@Column(name = "serial_number", length = 255, nullable = false)
private String serialNumber;
}
Код: Выделить всё
@Entity
@Table(name = "collet_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ColletItem extends Item {
@Column(name = "item_identifier", length = 255, nullable = false)
private String itemIdentifier;
}
Код: Выделить всё
ClampingDeviceItemКод: Выделить всё
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;
}
Код: Выделить всё
ItemCombinationКод: Выделить всё
@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;
}
Код: Выделить всё
Caused by: java.lang.IllegalArgumentException: Cannot set ch.rfag.Model.ClampingDeviceItem field ch.rfag.Model.ItemCombination.clampingDeviceItem to ch.rfag.Model.DeviceItem
Мои цели:
Сохранить элемент< /code> абстрактно, так как я планирую добавить больше подклассов в будущем, а также использовать стратегию «таблица за классом», чтобы обеспечить чистое разделение для каждого типа элементов и не иметь нулевых значений.
Как настроить Hibernate для использования таблицы для каждого класса? стратегию для этой структуры наследования?
PS: я знаю, что я мог бы просто указать тип в ItemCombination как Item, но это сделало бы его невозможным чтобы получить идентификатор элемента от соответствующего дочернего элемента. Даже с помощью экземпляра он не будет соответствовать ни одному из них.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ate-and-fi
Мобильная версия