我有一个实体类 MyEntity
可以与其他 MyEntity
相关联。我想定义 MyEntity 之间的关系。所以我最终得到了一个类
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
有关系,那么它相关的 MyEntity
也会被删除。
如果我修改@ManyToMany
注解为
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
然后不再删除相关的MyEntitys
。这看起来像是执行此操作的正确方法吗?
最佳答案
为了正确定义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<>();
参见 here更多示例。
关于java - 包含 Map<Entity, Entity> 字段的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55773890/