2016-06-28 33 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

这个答案是非常强大的,这就是为什么它没有任何代码。如果您怀疑我无法编写代码,您可以浏览我的答案或提出一个或多或少都很理智的问题。 –