我有一个Spring数据实体(使用JPA、w/ Hibernate和MySQL)定义如下:
@Entity
@Table(name = "dataset")
public class Dataset {
@Id
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "guid", nullable = false)
private String guid;
@Column(name = "size", nullable = false)
private Long size;
@Column(name = "create_time", nullable = false)
private Date createTime;
@OneToOne(optional = false)
@JoinColumn(name = "created_by")
private User createdBy;
@Column(name = "active", nullable = false)
private boolean active;
@Column(name = "orig_source", nullable = false)
private String origSource;
@Column(name = "orig_source_type", nullable = false)
private String origSourceType;
@Column(name = "orig_source_org", nullable = false)
private String origSourceOrg;
@Column(name = "uri", nullable = false)
private String uri;
@Column(name = "mimetype", nullable = false)
private String mimetype;
@Column(name = "registration_state", nullable = false)
private int registrationState;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinColumn(name = "dataset_id")
@JsonManagedReference
private List<DatasetFile> datasetFiles;对于这个实体,我有以下存储库:
public interface DatasetRepo extends JpaRepository<Dataset, Long> {
@Query("SELECT CASE WHEN COUNT(p) > 0 THEN 'true' ELSE 'false' END FROM Dataset p WHERE p.uri = ?1 and p.registrationState>0")
public Boolean existsByURI(String location);
@Query("SELECT a FROM Dataset a LEFT JOIN FETCH a.datasetFiles c where a.registrationState>0")
public List<Dataset> getAll(Pageable pageable);
@Query("SELECT a FROM Dataset a LEFT JOIN FETCH a.datasetFiles c WHERE a.registrationState>0")
public List<Dataset> findAll();
@Query("SELECT a FROM Dataset a LEFT JOIN FETCH a.datasetFiles c where a.guid= ?1")
public Dataset findByGuid(String guid);
}现在-在控制器中,我获取一个数据集,更新它的一个属性,我希望属性更改会被刷新到DB,但它从来没有。
@RequestMapping(value = "/storeDataset", method = RequestMethod.GET)
public @ResponseBody
WebServiceReturn storeDataset(
@RequestParam(value = "dsGUID", required = true) String datasetGUID,
@RequestParam(value = "stType", required = true) String stType) {
WebServiceReturn wsr = null;
logger.info("stType: '" + stType + "'");
if (!stType.equals("MongoDB") && !stType.equals("Hive") && !stType.equals("HDFS")) {
wsr = getFatalWebServiceReturn("Invalid Storage type '" + stType + "'");
} else if (stType.equals("MongoDB")) {
/* Here is where I'm reading entity from Repository */
Dataset dataset = datasetRepo.findByGuid(datasetGUID);
if (dataset != null) {
MongoLoader mongoLoader = new MongoLoader();
boolean success = mongoLoader.loadMongoDB(dataset);
logger.info("Success: " + success);
if (success) {
/* Here is where I update entity attribute value, this is never flushed to DB */
dataset.setRegistrationState(1);
}
wsr = getWebServiceReturn(success ? 0 : -1, "Successfully loaded dataset files into " + stType + " storage", "Failed to load dataset files into " + stType + " storage");
}
}
return wsr;
}谢谢
发布于 2016-08-19 21:54:06
您需要用@Transactional注释请求映射的方法。
为什么?如果要修改内存中的对象,然后在数据库中透明地更新对象,则需要在活动事务中进行更新。
不要忘记您正在使用JPA (spring-data正在使用JPA),如果您希望您的实体位于managed state中,则需要一个活动事务。
请参见:
透明更新一旦从数据库中检索到实体对象(无论以何种方式),就可以简单地在内存中从活动事务中修改它: Employee = em.find(Employee.class,1);em.getTransaction().begin();employee.setNickname(“水管工乔”);em.getTransaction().commit();
https://stackoverflow.com/questions/39027234
复制相似问题