当前位置: 首页 > 面试题库 >

当手动分配ID时,Spring Data MongoDB注释@CreatedDate不起作用

景育
2023-03-14
问题内容

我正在尝试使用审核在对象中保存dateCreated和保存dateUpdated,但是由于我是ID手动设置的,因此还有一些其他工作。

遵循Oliver
Gierke在DATAMONGO-946中的建议,
我试图弄清楚如何正确实现它。

作为上述Jira任务中的原始海报,我从此处https://github.com/spring-guides/gs-accessing-data-
mongodb.git下载了示例,并对其进行了一些修改:

package hello;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.domain.Persistable;

import java.util.Date;

public class Customer implements Persistable<String> {
    @Id
    private String id;
    @CreatedDate
    private Date createdDate;
    @LastModifiedDate
    private Date lastModifiedDate;
    private String firstName;
    private String lastName;
    private boolean persisted;

    public Customer() {
    }

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public void setPersisted(boolean persisted) {
        this.persisted = persisted;
    }

    @Override
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public boolean isNew() {
        return !persisted;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[id=%s, createdDate=%s, lastModifiedDate=%s, firstName='%s', lastName='%s']",
                id, createdDate, lastModifiedDate, firstName, lastName);
    }
}

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.config.EnableMongoAuditing;

@SpringBootApplication
@EnableMongoAuditing
public class Application implements CommandLineRunner {

    @Autowired
    private CustomerRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        repository.deleteAll();

        // create a customer
        Customer c = new Customer("Alice", "Smith");
        c.setId("test_id");

        // save a customer
        repository.save(c);

        // fetch all customers
        System.out.println("Customers found with findAll():");
        System.out.println("-------------------------------");
        for (Customer customer : repository.findAll()) {
            System.out.println(customer);
        }
        System.out.println();

        // create another customer with same id
        c = new Customer("Bob", "Smith");
        c.setId("test_id");
        c.setPersisted(true);
        repository.save(c);

        // fetch all customers
        System.out.println("Customers found with findAll():");
        System.out.println("-------------------------------");
        for (Customer customer : repository.findAll()) {
            System.out.println(customer);
        }
        System.out.println();
    }
}

执行的结果是:

Customers found with findAll():
-------------------------------
Customer[id=test_id, createdDate=Wed Feb 24 00:43:47 WITA 2016, lastModifiedDate=Wed Feb 24 00:43:47 WITA 2016, firstName='Alice', lastName='Smith']

Customers found with findAll():
-------------------------------
Customer[id=test_id, createdDate=null, lastModifiedDate=Wed Feb 24 00:43:47 WITA 2016, firstName='Bob', lastName='Smith']

createdDate``null在对象更新后变为。

我在这里想念什么?以及如何正确实施Persistable以使审核工作正常进行?


问题答案:

您的代码按预期工作。实施后,Persistable您可以看到@CreatedDate注释正在工作。

确定createdDatenull第二次调用,save因为该对象已存在于数据库中,并且已使用进行了更新createdDate = null。从文档中可以看到@CreatedDate

@CreatedDate批注。该字段标识当实体首次持久存储到数据库时其值已设置的字段。

因此createdDatenull在第二次调用时不要覆盖您的,您应该使用从数据库中检索客户c = repository.findOne("test_id");,然后对其进行更新。



 类似资料:
  • 我是Spring的新手,我很困惑@CreatedDate注释在实体中是如何工作的。 我做了一次谷歌搜索,有很多解决方案,但除了一个,没有一个适合我。我很困惑为什么? 这是我先试的 它不起作用。我为列中的值获取了NULL。 然后我做了这个。 这实际上将时间戳存储在db中。我的问题是,我遵循的大多数教程都建议我不需要来获取当前时间戳。看起来我确实需要它。我缺少什么吗?

  • 当我在spring aop拦截类上使用注释时,我使用了@target limit匹配方法。但调试时,会提示以下错误。 我的切入点是这样的 其中TimeIt是注释: 我把切点改成能跑了 我不太理解的是,MetricsFilter 类没有这个注释,那么为什么要生成代理呢?任何人都可以帮我吗?谢谢。

  • 我有一个简单的类叫BeaconDao 然而,当我用@service或@component标记beaconDao时,一切都运行得非常好。有人能看出问题所在吗?

  • 问题内容: 我正在尝试使用Java批注,但似乎无法使我的代码认识到其中存在。我究竟做错了什么? 问题答案: 您需要使用注释界面上的@Retention注释将注释指定为运行时注释。 即

  • 问题内容: 我知道有一些关于此的帖子,但是它们大约一年了,没有任何回应。实际上,我们在PostgreSQL 8.4上使用的是Hibernate 4.2.1.Final。我们有两个这样的实体 实体A(顶级层次结构类) 实体B(子类) 如您所见,使用注释了一个实体,但是当使用来获取顶级类时 我们也通过属性获得了B子类。实际上,SQL语句包含。这仍然是Hibernate第四版中的错误,还是我做错了什么?

  • 问题内容: 我从Spring Framework开始,想做一个带有注释的HelloWorld,我已经创建了一个控制器和一个视图,我猜它是基本的hello工作。但是,我想使用注释,因为我不能再使用SimpleFormController(已弃用)。 我收到的错误是Estado HTTP 404-/av/index.jsp 我正在使用Netbeans,并将示例基于它提供的基本模板。我有以下文件,我可以