Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实体属性在调用dao.findByID(id)后未更改_Java_Spring_Hibernate_Entitymanager - Fatal编程技术网

Java 实体属性在调用dao.findByID(id)后未更改

Java 实体属性在调用dao.findByID(id)后未更改,java,spring,hibernate,entitymanager,Java,Spring,Hibernate,Entitymanager,这里的问题是,为什么在调用实体的一些设置程序后,实体属性没有被保存。通常,在更改托管实体的属性时,它应该传播到数据库 看看这个例子: @Service public class SystemServiceImpl implements SystemService { @Autowired private SystemDao systemDao; @Override @Transactional public System replace(Long systemID) { // E

这里的问题是,为什么在调用实体的一些设置程序后,实体属性没有被保存。通常,在更改托管实体的属性时,它应该传播到数据库

看看这个例子:

@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;
}

}
-

@实体
@表(name=“db.system”)
公课制{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有长系统ID;
私有字符串名称;
@OneToMany(mappedBy=“system”,fetch=FetchType.LAZY)
@杰索尼奥雷
private List customers=new ArrayList();
公共长getSystemID(){
返回系统ID;
}
公共无效设置系统ID(长系统ID){
this.systemID=systemID;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共列表getCustomers(){
返回客户;
}
公共客户(列出客户){
这是。顾客=顾客;
}
}
如果在system.setName(“Test”)之后调用systemDao.merge,那么它将保存到数据库中。我觉得我不应该调用merge,因为它应该是一个托管实体

我尝试了用@Transactional和unwithout使用replace方法,结果都是一样的

有什么想法吗


谢谢,

如果SystemDao.findByID()返回分离的对象,则可以解释这种行为。确保SystemDao在加载对象后不使用RequiresNew事务或显式分离对象。
如果您发布SystemDao的代码和任何相关的配置条目(Spring、entity manager config等),这将非常有帮助。

如果SystemDao.findByID()返回分离的对象,则可以解释这种行为。确保SystemDao在加载对象后不使用RequiresNew事务或显式分离对象。

如果您发布SystemDao的代码和任何相关的配置条目(Spring、entity manager config等),这将非常有帮助。

错误发生在我运行集成测试时。事实证明,由于没有会话,Transactional没有做任何事情。解决方案是在我的测试中添加事务性测试。

错误发生在我运行集成测试时。事实证明,由于没有会话,Transactional没有做任何事情。解决方案是在我的测试中添加一个事务类。

你能添加@entity类吗,特别是列的定义,它不会导致Triggerals的更新,也不会取代某些更高级事务方法的方法部分吗?更新了答案,此外,replace方法是一个自定义方法,仅存在于我创建的接口中。是否调用
.save()
?我认为,如果不调用
.save()
或任何其他相关方法,数据库将不会得到更新。好的,如果它被管理,您不需要调用save。您可以添加@entity类吗,特别是列的定义,这些列不会导致Triggerals的更新,也不是某个更高级别的事务性方法的替换方法的一部分?更新了答案,而且替换方法是一个自定义方法,仅存在于我创建的接口中。是否调用
.save()
?我认为,如果不调用
.save()
或任何其他相关方法,数据库将不会得到更新。好的,如果它被管理,您不需要调用save。为什么实体在findByID之后会分离?如果这是可能的,那么请提供可能发生的方式。可能是一个我可以在源代码中搜索的配置示例。如果显式分离实体em.detach(object)或调用em.clear(),则该实体可以分离。如前所述,如果代码在单独的转换中运行,它也会分离。我也在运行Spring3.2。如果没有发布您的SystemDao代码和配置,我们将无法帮助您。如上所述,所有内容都指向这样一个事实,即对象加载在不同的事务中,而在被修改时不是当前会话的一部分。顺便说一句,HibernateDaoSupport已被弃用。公共接口SystemDao扩展了HibernateDaoSupport{System findByName(字符串名称);}为什么实体在findByID之后分离?如果这是可能的,那么请提供可能发生的方式。可能是一个我可以在源代码中搜索的配置示例。如果显式分离实体em.detach(object)或调用em.clear(),则该实体可以分离。如前所述,如果代码在单独的转换中运行,它也会分离。我也在运行Spring3.2。如果没有发布您的SystemDao代码和配置,我们将无法帮助您。如上所述,所有内容都指向这样一个事实,即对象加载在不同的事务中,而在被修改时不是当前会话的一部分。顺便说一句,HibernateDaoSupport已被弃用。公共接口SystemDao扩展了HibernateDaoSupport{System findByName(字符串名称);}
@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;
}
}