Spring boot JPA保存了很多关系

时间:2018-02-23 10:08:06

标签: java spring-boot spring-data

我试图存储多种关系,但它不存储关系。

以下代码生成了3个表。

士兵,奖章和士兵们。

该服务只使用save(士兵)调用CRUD接口。

它正确存储士兵,但它不会填充soldier_medals表中的任何行。

这是我发送给服务器的JSON:

{         " abbreviatedSequence":" XDF",         "奖牌":[             {                 " name":" Purple",                 " id":1             },             {                 " name":" Red",                 " id":2             }         ]         "序列":" XDFREE",         "姓名":" Savier"     }

Employee.java

@Entity(name="employees")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Employee {
    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    private Long id;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

Soldier.java

@Entity(name="soldier")
public class Soldier extends Employee{

    private String sequence;

    private String abbreviatedSequence;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "soldiers")
    private List<Medal> medals;

    public List<Medal> getMedals() {
        return medals;
    }

    public void setMedals(List<Medal> medals) {
        this.medals = medals;
    }

    public String getSequence() {
        return sequence;
    }

    public void setSequence(String sequence) {
        this.sequence = sequence;
    }

    public String getAbbreviatedSequence() {
        return abbreviatedSequence;
    }

    public void setAbbreviatedSequence(String abbreviatedSequence) {
        this.abbreviatedSequence = abbreviatedSequence;
    }

}

Medal.java

@Entity
@Table(name = "medal")
public class Medal {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "medal_seq")
    @SequenceGenerator(name = "medal_seq", sequenceName = "medal_seq", allocationSize = 1)
    private Long id;

    @Column(name = "NAME", length = 50, unique = true)
    @NotNull
    @Size(min = 3, max = 50)
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "soldier_medals", joinColumns = {
            @JoinColumn(name = "medal_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "soldier_id",
                    nullable = false, updatable = false) })
    private List<Soldier> soldiers;


    public List<Soldier> getSoldiers() {
        return soldiers;
    }

    public void setSoldiers(List<Soldier> soldiers) {
        this.soldiers = soldiers;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

SoldierController.java

@RestController
public class SoldierController {
    @Autowired
    private SoldierService soldierService;

    @RequestMapping(value="/api/contextsource/soldier",method= RequestMethod.POST)
    public Soldier addSoldier(@RequestBody Soldier soldier) {       
        return soldierService.addSoldier(soldier);
    }

}

2 个答案:

答案 0 :(得分:0)

你是否在士兵实体类中尝试过这个,比如奖牌实体类:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "soldier_medals", joinColumns = {
            @JoinColumn(name = "soldier_id", nullable = false, updatable = false) },
            inverseJoinColumns = { @JoinColumn(name = "medal_id",
                    nullable = false, updatable = false) })
    private List<Medal> medals;

而不是:

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "soldiers")
    private List<Medal> medals;

答案 1 :(得分:0)

我是以错误的顺序坚持实体。这就是我解决它的方法。

@RequestMapping(value="/api/contextsource/soldier",method= RequestMethod.POST)
    public Soldier addPeptide(@RequestBody Soldier soldier) {       
        for(Medal s: soldier.getMedals()) {
            Medal ss = medalService.getMedalById(s.getId());
            ss.getMedals().add(soldier);
            medalService.addMedal(ss);
        }           
        return null;
    }