调用Setter时Hibernate更新数据

时间:2017-09-08 14:03:37

标签: java spring hibernate

我在数据库中有一个加密值,我想在发送到前端之前解密它。 当我第一次将值保存为加密时,它在数据库中看起来像-kKwj477382jle34nw。但是,如果我调用我在此函数中进行解密的getClientByUsername()函数,当我在将对象发送到前端之前在对象中设置解密值时,数据库中的值也会自动更改。

@Transactional
public ResponseEntity <Client> getClientByUsername(String username) throws Exception {
  Client loggedClient = clientDAO.findByUsername(username);
  String data = loggedClient.getCreditCardNo();
  if (null != data) {
    @SuppressWarnings("static-access")
    byte[] encrypted = base64.decodeBase64(data);
    SecretKeySpec secretKeySpec = new SecretKeySpec(encryptionKey.getBytes(), algorithm);
    Cipher cipher = Cipher.getInstance(algorithm);
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
    decrypted = cipher.doFinal(encrypted);
    loggedClient.setCreditCardNo(new String(decrypted));
  }
  return new ResponseEntity < Client > (loggedClient, HttpStatus.OK);
}

以下是我将值保存为加密的方式:

@Transactional
public boolean clientUpdate(String client) {
    str = updateclient.getCreditCardNo();
    if (null != str) {
      SecretKeySpec secretKeySpec = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), algorithm);
      Cipher cipher = Cipher.getInstance(algorithm);
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      encrypted = cipher.doFinal(str.getBytes("UTF-8"));
      updateclient.setCreditCardNo(base64.encodeToString(encrypted));
      return clientDAO.updateProfileClient(updateclient);
    }

如何在调用setter时阻止hibernate更改值?

更新

@PersistenceContext
private EntityManager entityManager;

public Client findByUsername(String username) throws Exception {
      Query query = entityManager.createNamedQuery("Client.findByUsername");
      query.setParameter("username", username);
      List result = query.getResultList();
      return result.size() > 0 ? (Client) result.get(0) : null;
    }

1 个答案:

答案 0 :(得分:2)

你需要从Hibernate的会话中evict这个对象:

void evict(Object object) throws HibernateException
  

从会话缓存中删除此实例。对实例的更改   不会与数据库同步。此操作级联到   关联映射的关联实例   级联= “逐出”。

P.S。试想,你也可以考虑另一种方法。您可以在bean中创建一个标记为@Transient的字段,即与数据库分离,并将其命名为creditCardNoDecrypted。加密字段标记为@JsonIngore(或用于序列化的任何内容)。