#spring #spring-boot #jpa #entity
#spring #spring-boot #jpa #объект
Вопрос:
Можно ли назначить тип поля в качестве другого объекта в объекте, не указывая этот объект также как объект?
В этом примере каждый блок имеет местоположение, которое содержит различную информацию о состоянии этого местоположения.
@Entity
public class Block {
@Id
@GeneratedValue
private long id;
private String name;
private int quantity;
private double buyPrice;
private double sellPrice;
@ManyToOne
private Player player // <-- is another Entity
private Location location // <-- is not an Entity. Contains various fields regarding the block's location information.
...
}
С точки зрения базы данных я хочу, чтобы все данные блока и соответствующие им данные о местоположении были в одной таблице, потому что это взаимно однозначное отношение, которое в противном случае привело бы к ненужным объединениям и сложности.
С точки зрения ООП, я хочу, чтобы поля, относящиеся к местоположению блока, содержались в отдельном объекте, чтобы легко отличать состояние блока от состояния местоположения.
Я знаю, что могу создавать DTO и сопоставлять данные любым способом, который я пожелаю, но мне было интересно, есть ли какой-либо способ выполнить это «из коробки»
Ответ №1:
Посмотрите на @Embeddable
и @Embedded
.
Ответ №2:
Этот вопрос следует понимать двумя способами: первый способ должен иметь объект в сущности, но не в БД, а следующий способ заключается в том, что он должен быть в БД, но не в сущности. Таким образом, мы можем использовать @Transient и @Embeddable в наших кодах.
Аннотация @Transient в JPA или Hibernate используется для указания того, что поле не должно сохраняться или игнорировать поля для сохранения в базе данных. @Transient существует в javax. пакет сохранения. Он используется для аннотирования свойства или поля класса объектов, отображаемого суперкласса или встраиваемого класса
Следуя @Embedd, мы должны переопределить атрибуты, пожалуйста, перейдите по ссылке ниже для большей ясности