首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring数据JPA实体更改未持久化

Spring数据JPA实体更改未持久化
EN

Stack Overflow用户
提问于 2016-08-18 20:48:14
回答 1查看 1.4K关注 0票数 1

我有一个Spring数据实体(使用JPA、w/ Hibernate和MySQL)定义如下:

代码语言:javascript
运行
复制
@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;

对于这个实体,我有以下存储库:

代码语言:javascript
运行
复制
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,但它从来没有。

代码语言:javascript
运行
复制
@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;
    }

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 21:54:06

您需要用@Transactional注释请求映射的方法。

为什么?如果要修改内存中的对象,然后在数据库中透明地更新对象,则需要在活动事务中进行更新。

不要忘记您正在使用JPA (spring-data正在使用JPA),如果您希望您的实体位于managed state中,则需要一个活动事务。

请参见:

  • http://www.objectdb.com/java/jpa/persistence/update

透明更新一旦从数据库中检索到实体对象(无论以何种方式),就可以简单地在内存中从活动事务中修改它: Employee = em.find(Employee.class,1);em.getTransaction().begin();employee.setNickname(“水管工乔”);em.getTransaction().commit();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39027234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档