Vui lòng giải thích về insertable = false và updizable = false liên quan đến chú thích JPA @Column


151

Nếu một trường được chú thích insertable=false, updatable=false, điều đó không có nghĩa là bạn không thể chèn giá trị cũng như thay đổi giá trị hiện tại? Tại sao bạn muốn làm điều đó?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}

Câu trả lời:


120

Bạn sẽ làm điều đó khi trách nhiệm tạo / cập nhật thực thể liên quan trong câu hỏi không thuộc về thực thể hiện tại . Ví dụ, bạn có một Personvà một Address. Bạn muốn thêm insertable=false, updatable=falsevào @OneToManymối quan hệ với Personthực thể trong Addressthực thể, đơn giản vì đó không phải là trách nhiệm của Addressthực thể tạo hoặc cập nhật a Person. Đó là cách khác.


Nó đề cập đến việc xác định insertable=false,updatable=falsetrên một trong các khía cạnh của mối quan hệ.
BalusC

3
Bạn đang nói rằng với updizable = false trên Person, nó sẽ vô hiệu hóa cập nhật Person.name khi cập nhật địa chỉ (tôi không đồng ý vì đây là mục đích của tầng). Ngoài ra, bạn đang nói rằng định nghĩa @Column thực hiện một cái gì đó khác khi khóa ngoại (Person) của nó và khi đó không phải là khóa ngoại (vì không có thực thể được tham chiếu để tắt cập nhật). Bằng cách đọc javadoc để cập nhật, tôi sẽ nói rằng nó sẽ vô hiệu hóa để thay đổi Người cho Địa chỉ đã cho nếu nó được duy trì một lần. Bạn có thể giải thích được không?
Dòng chảy

8
Tôi nghĩ bạn có ý muốn nói ... to the @ManyToOne relationship with the ...??
Martin Konecny

110

Xác định insertable=false, updatable=falselà hữu ích khi bạn cần ánh xạ một trường nhiều lần trong một thực thể, thường là:

Đây là IMO không phải là một điều ngữ nghĩa, nhưng chắc chắn là một kỹ thuật.


15
Tôi tin tưởng mạnh mẽ rằng câu trả lời này tốt hơn nhiều so với câu trả lời được chấp nhận. Câu trả lời được chấp nhận truyền tải cảm giác rằng thuộc tính có thể chèn / cập nhật phải thực hiện với việc tạo / cập nhật thực thể liên quan, trong khi ý định thực sự đằng sau các thuộc tính này là để ngăn chèn / cập nhật cột trong thực thể hiện tại. Việc tạo / cập nhật của thực thể liên quan được giải quyết bằng thuộc tính tầng của chú thích ánh xạ.
Jayant

25

Tôi muốn thêm vào các câu trả lời của BalusCPascal Thivent khác sử dụng chung của insertable=false, updatable=false:

Hãy xem xét một cột không phải là id mà là một số loại số thứ tự . Trách nhiệm tính toán số thứ tự có thể không nhất thiết thuộc về ứng dụng.

Ví dụ: số thứ tự bắt đầu bằng 1000 và nên tăng thêm một cho mỗi thực thể mới. Điều này được thực hiện dễ dàng và rất thích hợp trong cơ sở dữ liệu và trong những trường hợp như vậy, các cấu hình này có ý nghĩa.


1
trình tự cũng được hỗ trợ bởi JPA, vì vậy bạn cũng có thể xác định trình tự của mình bằng các chú thích JPA.
eis

8

Một ví dụ khác sẽ nằm trên cột "created_on" nơi bạn muốn để cơ sở dữ liệu xử lý việc tạo ngày


Hibernate có nên chặn các bản cập nhật dựa trên chú thích updable = false không? Trong kho lưu trữ JPA của tôi, kiểm tra một cột created_on với chú thích này chấp nhận các cập nhật mà không có khiếu nại.
chrisinmtown

1
@chrisinmtown Eclipselink sẽ không bao gồm cột trong sql. Tôi hy vọng nó giống với Hibernate
Jaqen H'ghar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.