未持久化Spring数据JPA实体更改
我有一个Spring数据实体(使用JPA w/Hibernate和MySQL),定义如下:未持久化Spring数据JPA实体更改,spring,jpa,spring-data,Spring,Jpa,Spring Data,我有一个Spring数据实体(使用JPA w/Hibernate和MySQL),定义如下: @Entity @Table(name = "dataset") public class Dataset { @Id @GenericGenerator(name = "generator", strategy = "increment") @GeneratedValue(generator = "generator") private Long id; @Co
@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;
谢谢您需要用
@Transactional
注释请求映射的方法
为什么??如果要修改内存中的对象,然后在数据库中透明地更新该对象,则需要在活动事务中执行该操作
不要忘记您正在使用JPA(spring data
正在使用JPA
),如果您希望您的实体将处于托管状态,您需要一个活动事务
见:
从中检索到实体对象后进行透明更新
数据库(无论以哪种方式)可以在内存中简单地修改它
从活动事务内部:
Employee employee = em.find(Employee.class, 1);
em.getTransaction().begin();
employee.setNickname("Joe the Plumber");
em.getTransaction().commit();
您需要使用@Transactional
注释请求映射的方法
为什么??如果要修改内存中的对象,然后在数据库中透明地更新该对象,则需要在活动事务中执行该操作
不要忘记您正在使用JPA(spring data
正在使用JPA
),如果您希望您的实体将处于托管状态,您需要一个活动事务
见:
从中检索到实体对象后进行透明更新
数据库(无论以哪种方式)可以在内存中简单地修改它
从活动事务内部:
Employee employee = em.find(Employee.class, 1);
em.getTransaction().begin();
employee.setNickname("Joe the Plumber");
em.getTransaction().commit();
因此,我相当肯定,从Spring数据查询返回的实体没有得到管理(至少不是我想象的那样)。如果运行entityManager.contains(dataset)
,则返回false
。我可以通过运行合并更改的datasetRepo.save(dataset)
来持久化更改,但是,有人能告诉我为什么查询返回的实体没有被管理,以及我如何管理它吗?试着将您的方法storeDataset
注释为@Transactional
,您应该打开hibernate查询日志,看看封面下发生了什么。@PauChorro您指的是什么方法?我的代码中没有storeDataset
方法。我想说的是,您是请求映射storeDataset
,但它也是一种方法!:)因此,我相当肯定,从Spring数据查询返回的实体没有得到管理(至少不是我想象的那样)。如果运行entityManager.contains(dataset)
,则返回false
。我可以通过运行合并更改的datasetRepo.save(dataset)
来持久化更改,但是,有人能告诉我为什么查询返回的实体没有被管理,以及我如何管理它吗?试着将您的方法storeDataset
注释为@Transactional
,您应该打开hibernate查询日志,看看封面下发生了什么。@PauChorro您指的是什么方法?我的代码中没有storeDataset
方法。我想说的是,您是请求映射storeDataset
,但它也是一种方法!:)
Employee employee = em.find(Employee.class, 1);
em.getTransaction().begin();
employee.setNickname("Joe the Plumber");
em.getTransaction().commit();