调用 dao.findByID(id) 后实体属性没有改变
Entity properties are not changing after calling dao.findByID(id)
这里的问题是为什么在调用实体的一些setter之后实体属性没有被保存。通常在更改托管实体的 属性 时,它应该传播到数据库。
看看这个例子:
@Service
public class SystemServiceImpl implements SystemService {
@Autowired
private SystemDao systemDao;
@Override
@Transactional
public System replace(Long systemID) {
// External system to replace
System system = systemDao.findByID(systemID);
if (null != system) {
system.setName("Test"); // Calling findByID again shows that this call did not have any effect.
}
return system;
}
}
-
@Entity
@Table(name = "db.system")
public class System {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long systemID;
private String name;
@OneToMany(mappedBy = "system", fetch = FetchType.LAZY)
@JsonIgnore
private List<Customer> customers = new ArrayList<Customer>();
public Long getSystemID() {
return systemID;
}
public void setSystemID(Long systemID) {
this.systemID = systemID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Customer> getCustomers() {
return customers;
}
public void setCustomers(List<Customer> customers) {
this.customers = customers;
}
}
如果我在 system.setName("Test") 之后调用 systemDao.merge,那么它会被保存到数据库中。我觉得我不应该调用合并,因为这应该是一个托管实体。
我试过使用@Transactional 和不使用替换方法,两者都产生相同的结果。
有什么想法吗?
谢谢,
如果 SystemDao.findByID() returns 一个分离的对象,可以解释该行为。确保 SystemDao 不使用 RequiresNew-Transaction 或在加载对象后显式分离对象。
如果您发布 SystemDao 的代码和任何相关的配置条目(Spring、实体管理器配置、...),这将非常有帮助。
错误发生在我 运行 我的集成测试中。结果是 Transactional 没有做任何事情,因为没有会话。解决方案是在我的测试中添加事务。
这里的问题是为什么在调用实体的一些setter之后实体属性没有被保存。通常在更改托管实体的 属性 时,它应该传播到数据库。
看看这个例子:
@Service
public class SystemServiceImpl implements SystemService {
@Autowired
private SystemDao systemDao;
@Override
@Transactional
public System replace(Long systemID) {
// External system to replace
System system = systemDao.findByID(systemID);
if (null != system) {
system.setName("Test"); // Calling findByID again shows that this call did not have any effect.
}
return system;
}
}
-
@Entity
@Table(name = "db.system")
public class System {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long systemID;
private String name;
@OneToMany(mappedBy = "system", fetch = FetchType.LAZY)
@JsonIgnore
private List<Customer> customers = new ArrayList<Customer>();
public Long getSystemID() {
return systemID;
}
public void setSystemID(Long systemID) {
this.systemID = systemID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Customer> getCustomers() {
return customers;
}
public void setCustomers(List<Customer> customers) {
this.customers = customers;
}
}
如果我在 system.setName("Test") 之后调用 systemDao.merge,那么它会被保存到数据库中。我觉得我不应该调用合并,因为这应该是一个托管实体。
我试过使用@Transactional 和不使用替换方法,两者都产生相同的结果。
有什么想法吗?
谢谢,
如果 SystemDao.findByID() returns 一个分离的对象,可以解释该行为。确保 SystemDao 不使用 RequiresNew-Transaction 或在加载对象后显式分离对象。 如果您发布 SystemDao 的代码和任何相关的配置条目(Spring、实体管理器配置、...),这将非常有帮助。
错误发生在我 运行 我的集成测试中。结果是 Transactional 没有做任何事情,因为没有会话。解决方案是在我的测试中添加事务。