2016-09-29 125 views
2

我有一个对象模型,看起来像这样:为什么CrudRepository忽略@Column?

public class Agreement { 
    @Id @Column(name = "AGREEMENT_ID") private String agreementId; 

    @Column(name = "RATE") private String rate; 
    @Column(name = "NOTE") private String note; 
    ... // A number of other fields 
} 

每个字段都有getter和setter,如产生的IntelliJ,证实这些都是正确的。在我的GUI上,用户可以选择更改协议,然后点击“保存”。现在我的服务器需要在后端进行更新。我使用Spring库等我:

@Repository 
public interface AgreementRepository extends CrudRepository<Agreement, String> {} 

当用户我调用agreementRepository.save(agreement)提交。但是,我的其中一个字段rate未在后端进行更新。

我已遍历代码并验证属性在传递到save()agreement对象中设置正确。此外,我已经打印了SQL并验证了它实际上是在这个级别上,问题似乎正在发生,注意save()方法正在调用SELECT,然后是UPDATE,因为我一次又一次地修改同一条目。测试,但我可以清楚地看到UPDATE部分查询中没有设置rate字段。

不管我是否也设置RATE或不是,所有其他字段都设置正确。所有其他更改都传播得很好。这个RATE字段没有什么特别之处。我想可能是有一个不好的触发器,或者是我之前开发的一个开发者的东西,但是我可以看到Spring生成的SQL显然没有设置它,并且已经验证没有这样的触发器存在。

CrudRepository.save()会忽略我的一个领域的原因是什么?它没有标记为@Transient,并且在任何情况下并不罕见。如果它不是CrudRepository我应该在哪里看看为什么这个字段没有被正确设置?

+0

您正在使用哪个数据库?你是否检查数据库中存在“RATE”列? – Kuchi

+0

因此,其他列更新和评级,不是吗?你有@事务注释吗? – ZaoTaoBao

+0

RATE列存在,是一个'VARCHAR(128)'(绰绰有余),并且是'可空'。我试图将调用方法标记为“@Transactional”,并且达到了相同的效果。但是,是的,其他列更新得很好。 – mike

回答

0

这是真正的狂野部分。看来我的问题已通过重新启动IntelliJ解决。真的很难理解出了什么问题。

我首先将数据库中的列重命名为其他内容,但保留所有其他配置相同。我注意到没有例外被抛出,并试图找出原因,Spring存储库应该对我错误配置的实体大喊大叫。在经历了几次奇怪的事件之后,我认为最好重启IntelliJ以防万一。

突然它正确地拿起没有正确命名的列。我将该列重命名为它应该是的,并且所有内容都按预期工作。真是离奇。