У меня есть @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
?
В MyClass добавьте аннотацию Lombok @Delegate
к вашему PrimaryKey. Должно получиться так:
@Entity
@Data
public class MyClass {
@Delegate
@EmbeddedId
private PrimaryKey id;
}
Затем вы можете установить / получить поля PrimaryKey прямо из MyClass. Здесь - это ссылка, по которой вы можете узнать об этом больше.
Вы можете использовать AccessLevel с @Getter и @Setter следующим образом:
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private PrimaryKey id;
При использовании @Data у вас есть общий доступ к средствам доступа по умолчанию, а использование AccessLevel.NONE перезапишет поведение по умолчанию и не позволит получить доступ к средствам доступа.
Мой вопрос был больше связан с прокси-доступом к полям PrimaryKey непосредственно из MyClass, но все же это хороший способ вообще скрыть PrimaryKey, если это необходимо. Следует использовать вместе с @Delegate, как указано в следующем ответе.
Как сообщает здесь, аннотация теперь помечена как экспериментальная, и поддержка может быть удалена в будущей версии.