Я использую Spring boot и реализацию JPA / Hibernate.У меня есть 2 типа таблиц:
- ModelPool - список всех моделей (есть только 2 поля: идентификатор и имя)
- Model - описание модели (есть миллионыстрок для конкретной модели с некоторыми столбцами и идентификатором в качестве первичного ключа)
В некоторых случаях приложение создает новую модель и добавляет ее в таблицу ModelPool.Таким образом, должна быть 1 таблица modelPool и некоторое количество таблиц моделей.
Полностью понятно, как создать 2 очень большие таблицы, но это решение не подходит из-за низкой производительности.
Iне могу найти способ динамически создавать новую таблицу по запросу и как связать эту новую таблицу с пулом bean-компонента appcontext.
Теперь я ищу JPA @Query для создания sql-запроса самостоятельно, но ядо сих пор не знаю, как связать новую таблицу с модельным бобом.
Может быть, эта проблема типичная и существует типичное решение?
ОБНОВЛЕНО:
@Entity (name = "trackers")
public class Tracker implements Serializable, Comparable<Tracker> {
@Id
@GeneratedValue
private Integer id;
@Column
private String number;
@Column (name = "devID")
private String devID;
@Column (name ="creationtimestamp")
private long creationTimestamp;
@Column
private double lon;
@Column
private double lat;
public Tracker() {
this.creationTimestamp = System.currentTimeMillis();
}
@Override
public int compareTo(Tracker that) {
return Long.compare(this.creationTimestamp, that.creationTimestamp);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getDevID() {
return devID;
}
public void setDevID(String devID) {
this.devID = devID;
}
public long getCreationTimestamp() {
return creationTimestamp;
}
public void setCreationTimestamp(long creationTimestamp) {
this.creationTimestamp = creationTimestamp;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
}
@Service
public class TrackerService {
@Autowired
private TrackerRepository repository;
public void save(Tracker tracker) {
repository.save(tracker);
}
public List<Tracker> getAll() {
return StreamSupport
.stream(
Spliterators.spliteratorUnknownSize(repository.findAll().iterator(), Spliterator.NONNULL),
false)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
}
}
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/avlan_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=****
spring.datasource.password=****
spring.jpa.show-sql=true