У меня есть одна сущность, которая имеет ссылку на другую, но в стиле карты.Моя проблема в том, что ключ карты также будет другой сущностью, поэтому это не может быть сохранено.Обычно я использую ENUM, но я хочу, чтобы эти значения также были динамическими и сохранялись в базе данных, а не в моем коде.
У меня есть этот код, который корректно проверяется Hibernate и кодом SQL, который правильнопроверено с шагами Flyway.Однако я борюсь с реализацией необходимых методов для поиска и управления отношениями внутри класса Feature.
Я правильно делаю это сопоставление?Если да, как мне лучше всего написать метод getLatest (FeatureBase base ) в классе Feature?Если код неправильный, как лучше всего реализовать отношение Карта ?
Вот классы (без лишних частей):
Добавление:
@Entity(name = "Feature")
@Table(name = "FEATURE")
@NaturalIdCache
@org.hibernate.annotations.Cache(
usage = CacheConcurrencyStrategy.READ_WRITE
)
public class Feature {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NaturalId
@Column(name = "NAME", nullable = false, unique = true)
private String name;
@OneToMany(
mappedBy = "latest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> latest = new HashSet<>();
@OneToMany(
mappedBy = "base",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> latestBase = new HashSet<>();
FeatureBase:
@Entity(name = "FeatureBase")
@Table(name = "FEATURE_BASE")
@NaturalIdCache
@org.hibernate.annotations.Cache(
usage = CacheConcurrencyStrategy.READ_WRITE
)
public class FeatureBase {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@NaturalId
@Column(name = "NAME", nullable = false, unique = true)
private String name;
@OneToMany(
mappedBy = "latest",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> latest = new HashSet<>();
@OneToMany(
mappedBy = "feature",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> featureLatest = new HashSet<>();
public FeatureBase() {
}
Фрагмент:
@Entity(name = "Snippet")
@Table(name = "SNIPPET")
public class Snippet {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@OneToMany(
mappedBy = "base",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> latestBase = new HashSet<>();
@OneToMany(
mappedBy = "feature",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private Set<FeatureLatest> featureLatest = new HashSet<>();
FeatureLatest:
@Entity(name = "FeatureLatest")
@Table(name = "FEATURE_LATEST")
public class FeatureLatest {
@EmbeddedId
private FeatureLatestId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("featureId")
@JoinColumn(name = "FEATURE_ID")
private Feature feature;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("snippetId")
@JoinColumn(name = "SNIPPET_ID")
private Snippet latest;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("baseId")
@JoinColumn(name = "BASE_ID")
private FeatureBase base;
@Column(name="CHANGED_AT")
private Date changedAt;
private FeatureLatest() {}
public FeatureLatest(Feature feature, Snippet snippet, FeatureBase base) {
this.feature = feature;
this.latest = snippet;
this.base = base;
this.id = new FeatureLatestId(feature.getId(), snippet.getId(), base.getId());
}
FeatureLatestId:
@Embeddable
public class FeatureLatestId implements Serializable {
@Column(name="FEATURE_ID")
private Long featureId;
@Column(name="SNIPPET_ID")
private Long snippetId;
@Column(name="BASE_ID")
private Long baseId;
private FeatureLatestId() {}
public FeatureLatestId(Long featureId, Long snippetId, Long baseId) {
this.featureId = featureId;
this.snippetId = snippetId;
this.baseId = baseId;
}