Я создаю REST API-сервис для базы данных MySQL. Я генерировал классы, используя инструмент персистентности IntelliJ. Это делает довольно хорошую работу.
В схеме, с которой я работаю, есть некоторые причуды. Пользователи хотят, чтобы конечные точки были доступны другому свойству, кроме столбца первичного ключа "id".
Пример: /object/<name property>' versus
/ object / `.
Здесь есть подвох. Схема может измениться. Свойство name никуда не денется, поэтому можно смело предположить, что оно всегда будет на объекте.
Я узнал, что вы можете использовать суперклассы, чтобы эти сгенерированные объекты имели настраиваемые свойства, не влияя на схему базы данных. Я не хочу вносить изменения в модель в сгенерированном объекте и обновлять макет таблицы базы данных, поскольку это не моя база данных.
У меня есть класс под названием Animal.
@Entity
@Table(name = "animals", schema = "xyz123", catalog = "")
public class AnimalEntity extends AnimalSuperclass {
private Integer id;
private String name;
private String description;
@Id
@Column(name = "id", nullable = false)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = true, length = 80)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "description", nullable = true, length = 255)
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RoleEntity that = (RoleEntity) o;
return Objects.equals(id, that.id) &&
Objects.equals(name, that.name) &&
Objects.equals(description, that.description);
}
@Override
public int hashCode() {
return Objects.hash(id, name, description);
}
}
Я должен вручную добавить extends AnimalSuperclass. Что сейчас хорошо. В конце концов я собираюсь попытаться сгенерировать их, используя .xmls во время выполнения.
Тогда у меня есть этот суперкласс ..
@MappedSuperclass
public class AnimalSuperclass implements Serializable {
private String testMessage;
private String name;
private Integer id;
@Transient
public String getTestMessage() {
return this.testMessage;
}
public void setTestMessage(String id) {
this.testMessage = testMessage;
}
}
Что я хочу сделать, так это заставить аннотацию @Id
находиться в свойстве name внутри суперкласса. Что-то вроде этого..
@MappedSuperclass
открытый класс AnimalSuperclass реализует Serializable {
private String testMessage;
личное строковое имя;
закрытый целочисленный идентификатор;
@Transient
public String getTestMessage() {
return this.testMessage;
}
public void setTestMessage(String id) {
this.testMessage = testMessage;
}
@Basic
@Id
@Column(name = "name", nullable = false, length = 15)
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
@NaturalId
@Column(name = "id", nullable = false)
private Integer getId() {
return id;
}
private void setId(Integer id) {
this.id = id;
}
}
Как мне это сделать? В настоящее время выдается ошибка при достижении конечной точки: {"cause":null,"message":"Id must be assignable to Serializable!: null"}
Ява не мой родной язык, поэтому я ни в коем случае не эксперт. Но из того, что я прочитал, невозможно переопределить свойства подкласса из суперкласса. Есть ли лучший способ приблизиться к этому, может быть, используя RepositoryRestConfiguration
? Я использую PagingAndSortingRepository
для обслуживания этих организаций. Я не могу расширить сущности и использовать свой суперкласс в качестве дочернего, так как это создает свойство dType
в схеме, и я не могу изменить макет таблицы.