Как использовать наследование «таблица за классом» для абстрактных элементов в Hibernate и исправить проблемы с сопоставJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как использовать наследование «таблица за классом» для абстрактных элементов в Hibernate и исправить проблемы с сопостав

Сообщение Anonymous »

Я пытаюсь реализовать структуру наследования в своем проекте, где у меня есть абстрактный класс Item с несколькими конкретными подклассами, такими как ColletItem, DeviceItem и HolderItem. Моя цель — поддерживать дополнительные типы элементов в будущем, сохраняя при этом абстрактный класс Item.
Вот структура моих объектов:
Класс Abstract Item

Код: Выделить всё

@MappedSuperclass
public abstract class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "common_attribute", nullable = true)
private String commonAttribute;
}
Пример подкласса: DeviceItem

Код: Выделить всё

@Entity
@Table(name = "device_item")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeviceItem extends Item {
@Column(name = "serial_number", length = 255, nullable = false)
private String serialNumber;
}
Пример подкласса: ColletItem

Код: Выделить всё

@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;
}
Когда я пытаюсь получить объекты ItemCombination, я получаю следующую ошибку:

Код: Выделить всё

Caused by: java.lang.IllegalArgumentException: Cannot set ch.rfag.Model.ClampingDeviceItem field ch.rfag.Model.ItemCombination.clampingDeviceItem to ch.rfag.Model.DeviceItem
Похоже, Hibernate не может правильно отобразить абстрактный класс Item. Я подозреваю, что это связано с настройкой наследования или сопоставлением @ManyToOne с конкретными подклассами.
Мои цели:

Сохранить элемент< /code> абстрактно, так как я планирую добавить больше подклассов в будущем, а также использовать стратегию «таблица за классом», чтобы обеспечить чистое разделение для каждого типа элементов и не иметь нулевых значений.
Как настроить Hibernate для использования таблицы для каждого класса? стратегию для этой структуры наследования?
PS: я знаю, что я мог бы просто указать тип в ItemCombination как Item, но это сделало бы его невозможным чтобы получить идентификатор элемента от соответствующего дочернего элемента. Даже с помощью экземпляра он не будет соответствовать ни одному из них.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ate-and-fi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»