Spring Data JPA: возможно ли определить объект, содержащий поле объекта, не являющееся сущностью?

#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, мы должны переопределить атрибуты, пожалуйста, перейдите по ссылке ниже для большей ясности

https://www.baeldung.com/jpa-embedded-embeddable