如何映射一对多与自身的关系

时间:2015-08-03 07:27:49

标签: hibernate jpa

我有一个名为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>();

}

1 个答案:

答案 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);