2009-05-07 36 views
9

Tôi có một lược đồ cũ không thể thay đổi được. Tôi đang sử dụng một lớp cơ sở cho các tính năng phổ biến và nó có chứa một đối tượng nhúng. Có một trường thường được ánh xạ trong đối tượng được nhúng cần phải nằm trong id kiên trì cho chỉ một (nhiều) lớp con. Tôi đã thực hiện một lớp id mới bao gồm nó nhưng sau đó tôi nhận được lỗi rằng trường được ánh xạ hai lần. Dưới đây là một số mã ví dụ được nhiều đơn giản để duy trì sự tỉnh táo của người đọc:Làm thế nào để tạo một trường ánh xạ được kế thừa từ một siêu lớp siêu trong JPA?

@MappedSuperclass 
class BaseClass { 
    @Embedded 
    private Data data; 
} 

@Entity 
class SubClass extends BaseClass { 
    @EmbeddedId 
    private SubClassId id; 
} 

@Embeddable 
class Data { 
    private int location; 

    private String name; 
} 

@Embeddable 
class SubClassId { 
    private int thingy; 

    private int location; 
} 

Tôi đã thử @AttributeOverride nhưng tôi chỉ có thể lấy nó để đổi tên trường. Tôi đã cố gắng để thiết lập nó để updatable = false, insertable = false nhưng điều này dường như không hoạt động khi được sử dụng trong chú thích @AttributeOverride. Xem câu trả lời bên dưới để biết giải pháp cho vấn đề này.

Tôi nhận ra mình có thể thay đổi lớp cơ sở nhưng tôi thực sự không muốn chia nhỏ đối tượng được nhúng để tách trường được chia sẻ vì nó làm cho mã xung quanh trở nên phức tạp hơn và yêu cầu mã gói xấu xí. Tôi cũng có thể thiết kế lại toàn bộ hệ thống cho trường hợp góc này nhưng tôi thực sự không muốn.

Tôi đang sử dụng Hibernate làm nhà cung cấp JPA của mình.

Trả lời

5

Tôi đã tìm thấy lý do AttributeOverride không hoạt động. Khi chú thích lớp bạn phải bao gồm mã định danh của đối tượng được nhúng trong trường tên. Tôi đã làm điều này:

@Entity 
@AttributeOverride(name = "location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Khi nó cần thiết để được này:

@Entity 
@AttributeOverride(name = "data.location", column = @Column(name = "location", insertable = false, updatable = false) 
class SubClass extends BaseClass { 

Lạ một điều là rằng việc thay đổi lĩnh vực tên @ Cột đã làm việc với phiên bản đầu tiên nhưng insertable và các lĩnh vực có thể cập nhật đã được bỏ qua . Tôi không biết nếu đó là một lỗi hoặc một sự tinh tế của thông số kỹ thuật JPA.

Dù sao, điều này không giải quyết cách tạo trường chỉ đọc nhưng nó không trả lời câu hỏi gốc: Có thể tạo trường từ sơ đồ siêu lớp được ánh xạ không?

+0

Tôi biết đây là 6 tuổi, nhưng bạn đã bao giờ tìm thấy giải pháp cho câu hỏi này chưa? Và/hoặc nhớ nó là gì? –

+0

@EricB. Rất tiếc, không bao giờ tìm thấy cách không kế thừa trường được ánh xạ. Tôi không nghĩ rằng nó có thể làm điều đó. Tôi nghĩ rằng họ có thể thấy nó giống như cố gắng giảm khả năng hiển thị của một phương thức được kế thừa trong Java - vì vậy chỉ cần chống lại các quy tắc. Trong trường hợp của tôi, tôi đã làm việc quanh trường hợp góc đó là một chút xấu xí nhưng là lựa chọn duy nhất. –

Các vấn đề liên quan