2016-06-28 31 views
2

我有一個帶有兩個實體的OneToMany數據模型。一臺機器包含許多特性。CrudRepository:findAll()在無限循環中搜索

問題:當我嘗試獲取數據庫的完整數據時,程序在無限循環中搜索。見JSON結果 - 數據重複所有的時間...

[{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics":[{"name":null,"description":"CHARACTER2","type":0,"value":0,"machine":{"name":"Neue Machine","description":"Description der neuen machine","characteristics": 

等等...

我真的不知道爲什麼發生這種情況。以編程方式插入數據似乎工作正常! 目前的數據是由下列代碼行製備:

@RequestMapping(value = "/machine", method = RequestMethod.GET) 
    Collection<Machine> readMachines(){ 

     Machine machine = new Machine("Neue Machine", "Description der neuen machine"); 
     //Set<Characteristic> newCharacter = new HashSet<Characteristic>(); 
     for(int i = 0; i < 6; i++){ 
      machine.addCharacteristic(new Characteristic("CHARACTER" + Integer.toString(i),0,0)); 
     } 

     machineRepository.save(machine); 

     return (Collection<Machine>) machineRepository.findAll(); 
    } 

問題:哪裏無限循環來自何處?

數據庫模型

機:

enter image description here

創建語句:

CREATE TABLE `machine` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    `description` varchar(45) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 

實體:

@Entity 
@Table(name = "characteristic") 
public class Characteristic { 
    private int characteristic_id; 

    private String name; 

    private String description; 

    private int type; 

    private int value; 

    private Machine machine; 

    @ManyToOne 
    @JoinColumn(name="machine_id") 
    public Machine getMachine(){ 
     return machine; 
    } 

    public void setMachine(Machine machine){ 
     this.machine = machine; 
    } 

    public Characteristic() {} 

    public Characteristic(String description, int type, int value) { 
     this.description = description; 
     this.type = type; 
     this.value = value; 
    } 

    public Characteristic(int characteristic_id, String description, int type, int value) { 
     this.characteristic_id = characteristic_id; 
     this.description = description; 
     this.type = type; 
     this.value = value; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="characteristic_id") 
    public int getCharacteristic_Id() { 
     return characteristic_id; 
    } 

    public void setCharacteristic_Id(int characteristic_id) { 
     this.characteristic_id = characteristic_id; 
    } 

    @Column(name="name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Column(name="description") 
    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Column(name="type") 
    public int getType() { 
     return type; 
    } 

    public void setType(int type) { 
     this.type = type; 
    } 

    @Column(name="value") 
    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 
} 

特點:

enter image description here

創建語句:

CREATE TABLE `characteristic` (
    `characteristic_id` int(11) NOT NULL AUTO_INCREMENT, 
    `machine_id` int(11) NOT NULL DEFAULT '0', 
    `name` varchar(45) DEFAULT NULL, 
    `description` varchar(45) DEFAULT NULL, 
    `type` int(11) NOT NULL, 
    `value` int(11) DEFAULT NULL, 
    PRIMARY KEY (`characteristic_id`), 
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=latin1 

實體:

@Entity 
@Table(name = "machine") 
public class Machine { 
    private int machine_id; 

    private String name; 

    private String description; 

    private Set<Characteristic> characteristics; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "machine", cascade = CascadeType.ALL) 
    public Set<Characteristic> getCharacteristics() { 
     return characteristics; 
    } 

    public void setCharacteristics(Set<Characteristic> characteristics){ 
     this.characteristics = characteristics; 
    } 

    public Machine(){} 

    public Machine(String name, String description){ 
     this.name = name; 
     this.description = description; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="id") 
    public int getId() { 
     return machine_id; 
    } 

    public void setId(int machine_id) { 
     this.machine_id = machine_id; 
    } 

    @Column(name="name") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Column(name="description") 
    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public void addCharacteristic(Characteristic characteristic){ 
     if(this.characteristics == null){ 
      this.characteristics = new HashSet<Characteristic>(); 
     } 
     characteristic.setMachine(this); 
     this.characteristics.add(characteristic); 
    } 
} 

CrudRepository:

public interface MachineRepository extends CrudRepository<Machine, Integer>{} 
+0

因爲你有一個循環依賴的數據。 –

+0

@羅曼謝謝你的回答。我理解你的觀點,但我沒有看到模型中的循環依賴。你能詳細解釋一下嗎? – jublikon

回答

2

在您的代碼中,您返回的是Machine的集合。此課程有一對多依賴於CharacteristicCharacteristic類有多對一依賴項om Machine

Machine對象被序列化時,它正在尋找依賴關係Characteristic上一個回顧的是Machyne,依此類推。除非您排除引用同一對象的屬性,否則這些循環依賴關係無法序列化。您應排除一對多多對一屬性。

+0

我明白你的觀點。您能否請張貼一段示例代碼?我正在努力解決新的錯誤。爲什麼教程通常會提出這樣的循環依賴關係? – jublikon

+0

請,我無法獲得任何樣品在線工作 – jublikon

+0

這個答案是非常強大的,這就是爲什麼它沒有任何代碼。如果您懷疑我無法編寫代碼,您可以瀏覽我的答案或提出一個或多或少都很理智的問題。 –