当前位置: 首页 > 知识库问答 >
问题:

JPA@preupdate@persist似乎不像预期的那样工作

易俊友
2023-03-14
@Embeddable
@Getter
@Setter
@NoArgsConstructor
public class FieldAuditing implements Serializable {

    @Column(name = "DATE_CREATION", updatable = false)
    private Instant createdAt;

    @Column(name = "DATE_MODIFICATION", updatable = false)
    private Instant updatedAt;

    @Column(name = "DATE_SUPRESSION", updatable = false)
    private Instant deletedAt;

    @Column(name = "AUTEUR_CREATION", updatable = false, length = 100)
    private String createdBy;

    @Column(name = "AUTEUR_MODIFICATION", updatable = false, length = 100)
    private String updatedBy;

    @Column(name = "AUTEUR_SUPRESSION", updatable = false, length = 100)
    private String deletedBy;

    @Column(name = "IS_SUPPRIMER", nullable = false, updatable = false)
    private boolean isDeleted;

    @PrePersist
    public void prePersist() {
        setCreatedAt(Instant.now());
        setCreatedBy(LoggedInUser.get());
    }

    @PreUpdate
    public void preUpdate() {
        setUpdatedAt(Instant.now());
        setUpdatedBy(LoggedInUser.get());
    }

    @PreRemove
    public void preRemove() {
        setDeletedAt(Instant.now());
        setDeleted(true);
        setDeletedBy(LoggedInUser.get());
    }


}
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name="TF_CLIENT", schema="dbo")
public class Client implements Serializable {

    private static final long serialVersionUID = 8832848102370267801L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="native")
    @GenericGenerator(name = "native", strategy = "native")
    @Column(name = "CLT_ID", nullable = false)
    private Long id;

    @Column(name = "CLT_LIBELLE", nullable = false, length = 50, unique = true)
    private String libelle;

    @Temporal(TemporalType.DATE)
    @Column(name = "CLT_DT_OUVERTURE", nullable = false)
    private Date dateOuverture;

    @Temporal(TemporalType.DATE)
    @Column(name = "CLT_DT_FERMETURE")
    private Date dateFermeture;

    @Column(name = "CLT_B_ACTIF")
    private boolean isActif;

    @Embedded
    private FieldAuditing fieldAuditing = new FieldAuditing() ;

   //... rest of another attributes

}
private ClientDto save(ClientDto clientDto, Client client) {
        startDateShouldBeBeforeEndDate(clientDto);
        hasUniqueCodePaies(clientDto.getCodePaies());
        Client clientSaved = clientRepository.save(clientMapper.toEntity(clientDto, client));
        clientMapper.addOrRemoveClientActions(clientDto, clientSaved);
        clientMapper.addOrRemoveClientEtats(clientDto, clientSaved);
        clientRepository.save(clientSaved);
        clientDto.setId(clientSaved.getId());
        return clientDto;
    }

最后是持久性上下文配置:

@Configuration
@PropertySource({"classpath:application.yml"})
@EnableJpaRepositories(
        basePackages = "com.github.maaoutir.clientManager",
        entityManagerFactoryRef = "mainEntityManager")
public class PersistenceContext {

    private final Environment env;

    public PersistenceContext(Environment env) {
        this.env = env;
    }

    @Bean
    @Primary
    public DataSource mainDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(Objects.requireNonNull(env.getProperty("spring.datasource.driverClassName")));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean mainEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(mainDataSource());
        em.setPackagesToScan("com.github.maaoutir.clientManager");

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        // properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("spring.jpa.hibernate.dialect"));
        em.setJpaPropertyMap(properties);
        return em;
    }

    @Primary
    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(mainEntityManager().getObject());
        return transactionManager;
    }
}

我很感谢你的帮助。

共有1个答案

宋俊民
2023-03-14

您正在对以下列使用updatable=false:

@Column(name = "DATE_MODIFICATION", updatable = false)
private Instant updatedAt;

@Column(name = "AUTEUR_MODIFICATION", updatable = false, length = 100)
private String updatedBy;

这意味着JPA不使用该字段更新列。根据updatable的JPA规范:

列是否包含在持久性提供程序生成的SQL UPDATE语句中。

 类似资料:
  • 我有一个非常简单的Spring Boot应用程序。它只是一个zuul反向代理。除了基本设置之外,没有任何安全或其他东西可以通过eureka和路径映射发现我们的服务。我试图防止我们的执行器endpoint公开暴露,但仍然希望健康检查endpoint用于我们的ELB,但不希望它报告它所知道的所有服务的健康(我希望它是敏感的)。在试图弄清楚我需要设置什么属性来获得预期的行为时,我正在经历非常意外的行为。

  • 你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。 所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。 我的模型看起来如下: 我期待着任何帮助或提示,谢谢社区。

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 我有两个Avro模式V1和V2,在spark中读取如下: V1有两个字段“一”和“二” V2 与新字段:“三” 场景:编写器使用 V1 进行写入,读取器使用 V2 对 avro 记录进行解码。我的期望是看到字段3填充了默认值,即null。但是我在spark工作中遇到了以下异常。 我是不是错过了什么?我的理解是avro支持向后兼容。

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >

  • 为什么下面的失败? 测试的正确方法是什么?