2017-05-05 10 views
3

我正在使用spring-data-rest春季数据休息:在一对多关系调用后,外键更新为空

updatedaily_update是2个表,它们有一对多的关系。使用spring引导运行此应用程序。

当我使用post请求添加数据时,条目被添加到两个表中而没有任何错误,但在子表(daily_update)列“update_id”(更新表的外键)即将到来null

我使用Lombok作为setter和getter。

你能帮我解决吗?

UpdateEntity类:

@Data 
@Entity 
@Table(name = "update") 
public class UpdateEntity { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(generator = "UUID") 
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") 
    private String id; 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    @Column(name = "start_time") 
    private Date startTime; 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    @Column(name = "end_time") 
    private Date endTime; 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    @Column(name = "date_created") 
    private Date dateCreated; 

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
    @Column(name = "date_modified") 
    private Date dateModified; 

    @OneToMany(mappedBy = "updateEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    private Set<DailyUpdateEntity> dailyUpdateEntities = new HashSet<>(); 
} 

DailyUpdateEntity类:

@Data 
@Entity 
@Table(name = "daily_update") 
public class DailyUpdateEntity { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(generator = "UUID") 
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") 
    private String id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "update_id") 
    private UpdateEntity updateEntity; 

    @Column(name = "dimension_id") 
    private String dimensionId; 

    @Column(name = "hour") 
    private Integer hour; 

    @Column(name = "updated_type_id") 
    private String updatedTypeId; 
} 

UpdateRepository

@RepositoryRestResource(collectionResourceRel = "update", path = "update") 
public interface UpdateRepository extends CrudRepository<UpdateEntity, String> { 
} 

POST要求从邮递员http://localhost:8080/update

{ 
    "startTime" : "2016-08-18 10:34:26", 
    "endTime" : "2016-08-19 10:34:26", 
    "dateCreated" : "2016-06-18 10:34:26", 
    "dateModified" : "2016-06-18 10:34:26", 
    "dailyUpdateEntities" : 
     [ 
      { 
       "dimensionId" : "6ea91f60-2b1d-11e7-93ae-92361f002671", 
       "hour" : "01", 
       "updatedTypeId" : "6ea9273a-2b1d-11e7-93ae-92361f002671" 
      }, 
      { 
       "dimensionId" : "6ea92636-2b1d-11e7-93ae-92361f002671", 
       "hour" : "02", 
       "updatedTypeId" : "6ea92816-2b1d-11e7-93ae-92361f002671" 
      } 
     ] 
} 

击中并运行从春天启动

@SpringBootApplication 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
+0

请同时发布持久数据的代码。 –

+0

@AbdullahWasi:我坚持使用邮递员来电。同样的问题已经提到。并通过弹簧启动运行此应用程序 –

回答

0

这个应用程序看来问题是,你试图坚持错误的一边的关系。

您正在发布一个UpdateEntity(针对UpdateRepository),其中Set<DailyUpdateEntity>集合被映射为mappedBy = "updateEntity",这意味着这只是双向关联的只读端,实体之间不会有连接。

你将面临一个非空约束的错误,如果你将提高DailyUpdateEntity映射,如:

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@JoinColumn(name = "update_id") 
private UpdateEntity updateEntity; 

也许你应该调整你的映射或考虑其他的存储策略/订单。

2

我有确切的问题,该问题源于表关系的声明。从UpdateEntityDailyUpdateEntity,您声明以下形式的关系;

@OneToMany(mappedBy = "updateEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
private Set<DailyUpdateEntity> dailyUpdateEntities = new HashSet<>(); 

这导致问题,通过分离插入依赖实体,并添加外键到它。所以首先创建操作将总是缺少一个外键。通过以下声明,此问题已得到解决,并且创建将包含一个外键;

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "update_id", nullable = false, updatable = false) 
private Set<DailyUpdateEntity> dailyUpdateEntities = new HashSet<>(); 
+0

谢谢,这对我很有用。但是我不得不将'@ JoinColumn'注释添加到'@ ManyToOne'以及'insertable = false':'@ManyToOne(fetch = FetchType.EAGER)@JoinColumn(name =“update_id”,insertable = false, updatable = false) 私人UpdateEntity updateEntity;' – Benvorth

相关问题