Avatar
0
tiendat Beginner
tiendat Beginner
Xác định trường dữ liệu được thay đổi giá trị trong entity ở trong EntityListener PreUpdate
Giả sử mình có Entity là Student với 2 trường là name và age.

Khi mình sửa dữ liệu và save xuống DB, mình đang mong muốn ở trong EntityListener mình có thể detect được mình vừa sửa trường nào.

AE cho mình hỏi liệu có cách nào làm đơn giản mà không cần phải override can thiệp quá sâu vào hibernate không?

  • Answer
Remain: 5
1 Answer
Avatar
monkey Beginner
monkey Beginner
Hiện tại không có cách nào tốt hơn ngoài việc lấy ra entity cũ trong db và entity mới được lưu vào và so sánh cả. Tuy nhiên bạn có thể sử dụng hàm common này:

<span>import</span> java.util.HashSet;
<span>import</span> java.util.<span>Map</span>;
<span>import</span> java.util.Objects;
<span>import</span> java.util.<span>Set</span>;

<span>import</span> com.fasterxml.jackson.core.type.TypeReference;
<span>import</span> com.fasterxml.jackson.databind.ObjectMapper;

<span>import</span> lombok.AllArgsConstructor;

<span>@AllArgsConstructor</span>
public <span><span>class</span> <span>ChangedObjectDetector</span> </span>{

    private <span>final</span> ObjectMapper objectMapper;

    public <span>Set</span><<span>String</span>> getChangedFields(<span>Object</span> original, <span>Object</span> updated) {
        <span>Map</span><<span>String</span>, <span>Object</span>> originalMap = objectMapper.convertValue(
            original,
            <span>new</span> TypeReference<>() {}
        );
        <span>Map</span><<span>String</span>, <span>Object</span>> updatedMap = objectMapper.convertValue(
            updated,
            <span>new</span> TypeReference<>() {}
        );
        <span>Set</span><<span>String</span>> changedFields = <span>new</span> HashSet<>();
        <span>for</span> (<span>String</span> key : originalMap.keySet()) {
            <span>Object</span> originalValue = originalMap.<span>get</span>(key);
            <span>Object</span> updatedValue = updatedMap.<span>get</span>(key);

            <span>if</span> (!Objects.equals(originalValue, updatedValue)) {
                changedFields.add(key);
            }
        }
        <span>return</span> changedFields;
    }
}

Sẽ đơn giản hơn rất nhiều.

  • 1
  • Reply
Mình cảm ơn nhé.  –  tiendat 1677707220000