2017-04-18 56 views
0

我想实现和使用我的系统中的复合模式。复合模式,我无法从后端检索所有实体

问题是我无法从后端检索实体的所有层次结构。

我不知道是什么问题,抓取很好。所以,我不确定是否休眠。

让我们看看,这些是我的实体。

@Entity 
@Table(name = "game") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
@Document(indexName = "game") 
public class Game extends AbstractAuditingEntity implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@NotNull 
@Column(name = "name", nullable = false) 
private String name; 

@Column(name = "detail") 
private String detail; 

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name = "rule_id") 
private GameRule gameRule; 
... 

在这个类我保存主 “GameRule”

@Entity 
@Table(name = "game_rule") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) 
@DiscriminatorValue("rule") 
@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "_class") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = SimpleRule.class, name = "SimpleRule"), 
    @JsonSubTypes.Type(value = CompositeRule.class, name = "CompositeRule") }) 
public abstract class GameRule implements Serializable { 
private static final long serialVersionUID = -4597791997254248990L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id", nullable = false) 
private Long id; 
private String operator; 

在这个类我救GameRules

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING) 
@DiscriminatorValue("group") 
public class CompositeRule extends GameRule { 
private static final long serialVersionUID = 6197786758476721324L; 
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 
@JoinTable(name = "game_rules_hierarchy", 
     joinColumns = @JoinColumn(name = "parent_rule_id", referencedColumnName = "id"), 
     inverseJoinColumns = @JoinColumn(name = "child_rule_id", referencedColumnName = "id")) 
@OrderBy("id") 
private List<GameRule> rules; 

public List<GameRule> getRules() { return rules; } 

public void setRules(List<GameRule> rules) { this.rules = rules; } 

列表而现在的叶实体。现在

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING) 
@DiscriminatorValue("simple") 
public class SimpleRule extends GameRule { 
private static final long serialVersionUID = 6197786758476721324L; 

private String variable; 
private Double value; 

@ManyToOne 
@NotNull 
private Device device; 

,该restController检索数据

@RequestMapping(value = "/games/{id}", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
@Timed 
@Transactional 
public ResponseEntity<Game> getGame(@PathVariable Long id) { 
    log.debug("REST request to get Game : {}", id); 
    Game game = gameRepository.findOne(id); 

    return Optional.ofNullable(game) 
      .map(result -> new ResponseEntity<>(
       result, 
       HttpStatus.OK)) 
      .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); 
    } 

现在在视图中我能收到有关simpleRule对象CompositeRule对象,但一无所获。

从UI(角度),我使用此JSON来加载层次结构。

vm.game.gameRule = {id: null, operator: "", type:null, _class:"CompositeRule", 
      rules: [ {id: null, operator: "", type:null, _class:"CompositeRule", rules: 
       [{id: null, type:null, _class:"SimpleRule", device: "6", variable: "POWER", operator: ">", value: "100"}, 
        {id: null, type:null, _class:"SimpleRule", device: "6", variable: "POWER", operator: ">", value: "100"}]} 
      ]}; 

这成功加载到数据库中。但问题是当我尝试检索整个层次结构时。目前,我仅接收CompositeRule对象,类似于:

vm.game.gameRule = {id: 1, operator: "", type:null, _class:"CompositeRule", 
      rules: [ {id: 2, operator: "", type:null, _class:"CompositeRule", rules:[]} ]};] 

在RestController中,我能够看到所有层次结构对象。我不确定问题是什么。

感谢您的阅读。

回答

0

我的坏话!

一切都很好。我的问题是在控制台日志中。似乎Chrome中的控制台没有显示所有的层次结构。但是如果我进入网络视图,我可以看到一切。

谢谢。