Spring JPA Persist ManyToOne(Child)对象

时间:2016-09-20 12:32:17

标签: java spring hibernate spring-data spring-data-jpa

我在使用spring jpa持久化具有ManyToOne关系的Object时遇到问题。

这些是我的课程。

父类

@Entity
@Table(name = "PROVINCE")
public class Province {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PROVINCE_ID")
    private long id;

    private String name;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "province", targetEntity = Town.class)
    @JsonManagedReference("Province-Town")
    private List<Town> towns;

    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;
    }

    public List<Town> getTowns() {
        return towns;
    }

    public void setTowns(List<Town> towns) {
        this.towns = towns;
    }
}

儿童班

@Entity
@Table(name = "TOWN")
public class Town {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "TOWN_ID")
    private long id;

    private String name;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "PROVINCE_ID")
    @JsonBackReference("Province-Town")
    private Province province;

    private long kiloMeter;

    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;
    }

    public Province getProvince() {
        return province;
    }

    public void setProvince(Province province) {
        this.province = province;
    }

    public long getKiloMeter() {
        return kiloMeter;
    }

    public void setKiloMeter(long kiloMeter) {
        this.kiloMeter = kiloMeter;
    }
}

仅供参考,我已经为各自的类提供了存储库和服务。

用于创建城镇实体的我的RestController是..

@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Void> create(@RequestBody Town town, UriComponentsBuilder ucBuilder) {
    if (townService.isTownExists(town)) {
        LOGGER.info("Unable to save {}. Town already exists", town.getName());
        return new ResponseEntity<Void>(HttpStatus.CONFLICT);
    }

    townService.save(town);

    HttpHeaders headers = new HttpHeaders();
    headers.setLocation(ucBuilder.path(BASE_PATH + "/{id}").buildAndExpand(town.getId()).toUri());
    return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}

问题是我想将对象与父实体(省)一起发布。

假设我已经持有 id为1 的省份。我在POSTMAN中发送的JSON正文就是这个。

{
   "name" : "Some Town",
   "province" : {
        "id" : 1
   },
   "kiloMeter" : 340
}

但是我收到了错误。

 "exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
  "message": "detached entity passed to persist:    org.pipecrafts.busnet.model.location.misc.Province; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: org.pipecrafts.busnet.model.location.misc.Province",

当我发送这样的请求时,它是成功的。

{
   "name" : "Some Town",
   "kiloMeter" : 340
}

0 个答案:

没有答案
相关问题