我有一个名为TERRITORY的表,其中包含ID,NAME,ID_PARENT_TERRITORY。这是TERRITORY_WITH_SUBTERRITORIES中的一对多。 TERRITORY_WITH_SUBTERRITORIES中的两列都是TERRITORY(自引用)的自身外键。这会存储如下行:
TERRITORY: ID NAME ID_PARENT_TERRITORY --- ------ --------------------- 1 India null 2 Karnataka 1 3 Bangalore 2
TERRITORY_WITH_SUBTERRITORIES: ID_PARENT_TERRITORY ID_SUBTERRITORY --------------------- ------------------ 1 2 2 3
当数据保存到TERRITORY时,我无法将数据保存到TERRITORY_WITH_SUBTERRITORIES。
我写的联接表是:
@OneToMany(fetch = FetchType.LAZY, targetEntity = TerritoryDataImpl.class)
@JoinTable(name = "TERRITORY_WITH_SUBTERRITORIES",
joinColumns = @JoinColumn(name = "ID_SUBTERRITORY"),
inverseJoinColumns = @JoinColumn(name = "id_parent_territory"))
private List<Territory> childrenStructures = new ArrayList<Territory>();`
在从UI收集parentStructure之后,我已经按照以下代码保存:
territory.getParentTerritorialStructure().getChildrenStructures().add(object);
entityManager.merge(territory);
TerritoryDataImpl:
@Entity
@Table(name = "territory")
public class TerritoryDataImpl {
@Id
@GeneratedValue
@Column(name = "id", columnDefinition = "serial", nullable = false)
private Long id;
@Length(max = 50)
@Column(name = "name", length = 50)
private String name;
@OneToMany(fetch = FetchType.LAZY, targetEntity = TerritoryDataImpl.class)
@JoinTable(name = "TERRITORY_WITH_SUBTERRITORIES",
joinColumns = @JoinColumn(name = "id_parent_structure"), inverseJoinColumns = @JoinColumn(
name = "ID_SUBTERRITORY"))
private List<Territory> childrenStructures = new ArrayList<Territory>();
}
答案 0 :(得分:1)
这有效:
@Entity
@Table(name = "territory")
public class TerritoryDataImpl {
@Id
@GeneratedValue
@Column(name = "id", columnDefinition = "serial", nullable = false)
private Long id;
@Length(max = 50)
@Column(name = "name", length = 50)
private String name;
@OneToOne(fetch = FetchType.EAGER, targetEntity = TerritoryDataImpl.class)
@Column(name="ID_PARENT_TERRITORY")
private TerritoryDataImpl parentTerritorialStructure;
@OneToMany(mappedBy = "territoryStructure", targetEntity = TerritoryDataImpl.class,
orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE})
private List<Territory> childrenStructures = new ArrayList<Territory>();
@ManyToOne(fetch = FetchType.EAGER, targetEntity = TerritoryDataImpl.class)
@JoinTable(name = "TERRITORY_WITH_SUBTERRITORIES",
joinColumns = @JoinColumn(name = "id_parent_structure"), inverseJoinColumns = @JoinColumn(
name = "ID_SUBTERRITORY"))
private TerritoryDataImpl territoryStructure;
}
在从UI收集parentStructure之后,我按照以下代码进行保存:
object.setTerritoryStructure(object.getParentTerritorialStructure());
entityManager.merge(territory);