如何禁用Spring Data MongoDB文档的字段映射?

4

我正在使用Spring Data通过MongoRepository将POJO持久化为MongoDB中的文档。看起来Spring自动将字段和getter都持久化到MongoDB中。

通常情况下,我希望它只持久化getter,而不会自动持久化字段。我知道@Transient可以用于一次性注解,但希望将其配置为通用行为。

是否有方法可以进行配置?


你尝试过将getter标记为transient并使字段私有化吗?如果按照JPA的实现方式,这应该可以解决问题(尽管可能有些违反直觉)。 - Markus W Mahlberg
一般来说,我的所有字段都是私有的,并且它们都会被持久化。我可以将私有字段本身标记为@Transient,这样就可以防止其被持久化。然而,我要将POJOs移植到MongoDB中,通常只需要从它们的getter中持久化数据,而私有字段不应该被持久化。更糟糕的是,当一个类继承另一个类并且一个私有字段与超类中的公共getter具有相同的名称时,我会定期遇到字段冲突的情况。 - DanJ
这就是为什么我说注释getter而不是私有字段可能会有所帮助...或者我在这里理解错了... - Markus W Mahlberg
哈,我不确定。你说可能有些违反直觉,所以也许我漏掉了什么。我的理解是,如果我将getter标记为Transient,则它不会持久化getter的结果,这与我想要的相反。但无论如何,我正在寻找一个系统级别或甚至类级别的配置选项,使Spring在持久化时忽略所有字段成员。否则,似乎我必须进入所有的类并显式地将所有成员变量标记为Transient。这似乎是错误的/侵入性的? - DanJ
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - DanJ
1个回答

0

你可以通过编写自己的自定义转换器来实现。

你在问题中提到spring data mongodb持久化字段和getter。据我所知,只有字段被持久化。(请参见文档11.1:http://docs.spring.io/spring-data/mongodb/docs/1.6.3.RELEASE/reference/html/#mapping-conventions (1.6.3是由spring-boot 1.2.6提供的版本,但在旧版本和1.8.0中也是相同的))

或者一个简短的例子:

如果你有一个像这样的Pojo:

@Document
public class MyClass
{
    private ObjectId id;

    private String foo = "foo";

    public String getBar()
    {
        return "bar";
    }
}

还有像这样的代码仓库:

public interface MyClassRepository extends MongoRepository<MyClass,ObjectId>
{
}

以及像这样的应用程序代码:

public static void main(String[] args) throws UnknownHostException
{
    ApplicationContext ctx = SpringApplication.run(NewClass.class, args);
    MongoTemplate mongoTemplate = ctx.getBean(MongoTemplate.class);
    MyClass myClass = new MyClass();
    mongoTemplate.save(myClass);
    MyClassRepository myClassRepository = ctx.getBean(MyClassRepository.class);
    myClassRepository.save(myClass);
}

以下文件已保存(先由模板保存,然后再由存储库保存):

{
    "_id" : ObjectId("560b97edcb60110890ab7119"),
    "_class" : "sandbox.MyClass",
    "foo" : "foo"
}

所以,getter方法没有被用于转换MyClass对象。

与上述引用的相同文档展示了如何编写自己的转换器并将其注册到MongoTemplate(第8.10节)。您可以在此处编写一些代码,使用类的已声明getter方法,并将它们映射到文档的字段上。


啊,你说得对。在Hibernate中,我们总是使用“仅属性”模式并禁用字段访问器。所以我一直在从Spring数据的角度反向思考,这就是我的困惑来源。有趣...好的,谢谢你的帮助! - DanJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接