2015-08-03 5 views
2

У меня есть таблица под названием TERRITORY, в которой есть ID, NAME, ID_PARENT_TERRITORY. Это один из многих с TERRITORY_WITH_SUBTERRITORIES. Оба столбца в TERRITORY_WITH_SUBTERRITORIES - это собственный внешний ключ для TERRITORY (Self-ссылки). Это хранит строки, как это:Как сопоставить отношение одного ко многим с самим собой

 
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_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>();` 

После территории собирает 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

Вы можете разделить классы моделей для КРАЯ и TERRITORY_WITH_SUBTERRITORIES так, что поправки могут быть сделаны? –

+0

Какая ошибка? Вы пробовали CascadeType PERIST/UPDATE/MERGE? –

+0

@ B.K: Поставляется модельный класс для TERRITORY. Нет класса модели для TERRITORY_WITH_SUBTERRITORIES, так как это таблица соединений без дополнительных столбцов и сама привязана к TERRITORY. Таким образом, существует только один модельный класс. – User1230321

ответ

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; 

    } 

После территории собирает parentStructure из пользовательского интерфейса, я следующий код, чтобы сохранить:

object.setTerritoryStructure(object.getParentTerritorialStructure()); 
entityManager.merge(territory);