Как выставить поля и @EmbeddedId

У меня есть @Entity с тремя полями A, B, C, из которых A и B действуют как составной первичный ключ. Я создал класс @EmbeddedId, содержащий A и B. Чтобы облегчить задачу определения геттеров и сеттеров, я использовал аннотацию lombok @Data.

@Entity
@Data
public class MyClass {
    @EmbeddedId
    private PrimaryKey id;
}

@Embeddable
@Data
public class PrimareyKey implements Serializable {
    private String A;
    private String B;
}

Я не хотел бы раскрывать, что A и B являются первичным ключом и имеют доступ к A и доступ ко всем полям одинаковым образом.

//Exposes primary key
myObject.getid().getA();
myObject.getid().getB();
myObject.getC();

//Hides primary key
myObject.getA();
myObject.getB();
myObject.getC();

В настоящее время можно использовать @IdClass, помечая каждое поле, поданное как @Id, как предложено в этом ответе, но если мне все еще нужно использовать @EmbeddedId (или фактически любой @Embedded), единственный способ (я знаю) добиться этого - написать специальные геттеры и сеттеры в обход переменной id, например

@Entity
@Data
public class MyClass {
    @EmbeddedId
    private PrimaryKey id;

    public String A getA(){
        return id.getA()
    }

    public String A setA(String a){
        id.setA(a);
    }
    //same for B and any other fiels in PrimaryKey

}

Похоже, что нужно писать и поддерживать много шаблонного кода.

Есть ли аннотация для демонстрации геттеров и сеттеров @EmbeddedId?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 090
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В MyClass добавьте аннотацию Lombok @Delegate к вашему PrimaryKey. Должно получиться так:

@Entity
@Data
public class MyClass {
    @Delegate
    @EmbeddedId
    private PrimaryKey id;
}

Затем вы можете установить / получить поля PrimaryKey прямо из MyClass. Здесь - это ссылка, по которой вы можете узнать об этом больше.

Как сообщает здесь, аннотация теперь помечена как экспериментальная, и поддержка может быть удалена в будущей версии.

Giovanni Paolo Gibilisco 04.05.2018 13:19

Вы можете использовать AccessLevel с @Getter и @Setter следующим образом:

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private PrimaryKey id;

При использовании @Data у вас есть общий доступ к средствам доступа по умолчанию, а использование AccessLevel.NONE перезапишет поведение по умолчанию и не позволит получить доступ к средствам доступа.

Мой вопрос был больше связан с прокси-доступом к полям PrimaryKey непосредственно из MyClass, но все же это хороший способ вообще скрыть PrimaryKey, если это необходимо. Следует использовать вместе с @Delegate, как указано в следующем ответе.

Giovanni Paolo Gibilisco 03.05.2018 11:30

Другие вопросы по теме