Как правильно добавить карту?поле - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть класс сущности MyEntity, который может быть связан с другим MyEntitys.Я хочу определить отношения между MyEntitys.Итак, я получил класс как

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.util.HashMap;
import java.util.Map;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Accessors(chain = true)
@Entity
@Table
public class MyEntity {
    @Id
    @GeneratedValue
    private Long id;

    @NonNull
    private String name;

    private String email;

    private String phone;

    @NonNull
    @OneToOne
    private MyEntityType myEntityType;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Map<String, Address> addresses = new HashMap<>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable()
    private Map<Relationship, MyEntity> relationships = new HashMap<>();

    public MyEntity addAddress(String key, Address address) {
        addresses.put(key, address);
        return this;
    }

    public MyEntity addRelationship(Relationship relationship, MyEntity myEntity) {
        relationships.put(relationship, myEntity);
        return this;
    }
}

, где класс отношений выглядит как

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

import javax.persistence.*;

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Entity
@Table
@Accessors(chain = true)
public class Relationship {
    @Id
    @GeneratedValue
    private Long id;
    @NonNull
    private String name;
    @NonNull
    private String antonym;
}

Поле, о котором идет речь, - это поле отношений в MyEntity.

Кажется, что все работает, пока я не удалю MyEntity.Если удаленный MyEntity не имеет отношений, все в порядке.Если удаленный MyEntity имеет отношения, то MyEntitys, с которым он связан, также удаляется.

Если я изменю аннотацию @ManyToMany на

    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})

Тогда соответствующий MyEntitys больше не удаляются.Это похоже на правильный способ сделать это?

1 Ответ

0 голосов
/ 20 апреля 2019

Чтобы правильно определить отображение Map<Entity, Entity>, необходимо объединить аннотации @ManyToMany (или @OneToMany), @JoinTable и @MapJoinColumn:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(...)
@MapKeyJoinColumn(name = "relationship_id")
private Map<Relationship, MyEntity> relationships = new HashMap<>();

См. здесь для дополнительных примеров.

...