Cod*_*oet 6 java spring-data spring-data-jpa spring-data-rest
我正在使用spring-data-rest。
update并且daily_update是具有一对多关系的2表。使用Spring Boot运行此应用程序。
当我使用发布请求添加数据时,条目被添加到两个表中而没有任何错误,但是在子表(daily_update)列中,“ update_id”(更新表的外键)即将到来null。
我正在使用Lombok二传手和吸气剂。
你能帮我吗?
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<>();
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
UpdateRepository:
@RepositoryRestResource(collectionResourceRel = "update", path = "update")
public interface UpdateRepository extends CrudRepository<UpdateEntity, String> {
}
Run Code Online (Sandbox Code Playgroud)
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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
并从春季启动运行此应用程序
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到了确切的问题,这个问题源于表关系的声明。从UpdateEntity到DailyUpdateEntity,您以以下形式声明关系;
@OneToMany(mappedBy = "updateEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<DailyUpdateEntity> dailyUpdateEntities = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
通过分离从属实体的插入,并为其添加外键,从而导致了问题。因此,首先创建操作将始终缺少外键。通过以下声明,此问题得以解决,并且创建将包含外键;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "update_id", nullable = false, updatable = false)
private Set<DailyUpdateEntity> dailyUpdateEntities = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
看来问题是你试图在错误的一边坚持这种关系。
您正在发布一个 UpdateEntity(针对 UpdateRepository),您将集合映射到其中,Set<DailyUpdateEntity>这mappedBy = "updateEntity"意味着这只是双向关联的只读端,实体之间不会有连接。
如果您像下面这样增强 DailyUpdateEntity 映射,您将面临非空约束错误:
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "update_id")
private UpdateEntity updateEntity;
Run Code Online (Sandbox Code Playgroud)
也许您应该调整您的映射或考虑其他存储策略/顺序。
| 归档时间: |
|
| 查看次数: |
3397 次 |
| 最近记录: |