Hibernate - как реализовать отношения в стиле карты с сущностью в качестве ключа? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть одна сущность, которая имеет ссылку на другую, но в стиле карты.Моя проблема в том, что ключ карты также будет другой сущностью, поэтому это не может быть сохранено.Обычно я использую 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...