2010-06-15 31 views
24

Tôi đang phát triển một dự án mà trong đó tôi đang lưu giữ một số POJO bằng cách thêm chú thích Hibernate. Một vấn đề tôi gặp phải là mã như thế này không thành công, vì Hibernate cố gắng ánh xạ các trường con trong số Time_T lên cùng một cột (tức là startTime.secstopTime.sec cả hai cố gắng ánh xạ tới cột sec, gây ra lỗi).Tự động thêm tiền tố vào tên cột cho các lớp @Embeddable

@Entity 
public class ExampleClass 
{ 
    @Id 
    long eventId; 

    Time_T startTime; 
    Time_T stopTime; 
} 

@Embeddable 
public class Time_T 
{ 
    int sec; 
    int nsec; 
} 

Như sẽ có nhiều lần xuất hiện như thế này trên toàn hệ thống, nó sẽ được tốt đẹp nếu có một tùy chọn để tự động nối thêm một tiền tố cho tên cột (ví dụ như làm cho các cột được startTime_sec, startTime_nsec, stopTime_sec, stopTime_nsec), mà không cần phải áp dụng ghi đè trên cơ sở từng lĩnh vực. Liệu Hibernate có khả năng này, hoặc có bất kỳ công việc hợp lý nào khác không?

+0

lẽ theo dõi các trả có câu trả lời: http://stackoverflow.com/questions/331744/jpa-multiple-embedded-fields –

Trả lời

21

Cố gắng thiết lập thuộc tính hibernate.ejb.naming_strategy-org.hibernate.cfg.DefaultComponentSafeNamingStrategy

+5

Hibernate 5 chia chiến lược đặt tên trong một phần ngầm (khi không có ghi đè cột rõ ràng nào được đưa ra) và phần vật lý, phần này ghi đè bất kỳ việc đặt tên nào ngay cả khi được xác định rõ ràng với chú thích cột. Có một mặc định ngầm chiến lược đặt tên có sẵn, mà tiền tố lớp nhúng: 'hibernate.implicit_naming_strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl' Xem thêm các [Hibernate tài liệu] [1] để biết thêm chi tiết [1]: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html –

+0

Nếu tôi đã sử dụng chiến lược đặt tên tùy chỉnh thì sao? Có phương pháp cụ thể nào để ghi đè bằng phương pháp từ chiến lược này không? –

4

Một cách khác để giải quyết vấn đề là bằng cách sử dụng @AttributeOverrides và chú thích @AttributeOverride. Trong ví dụ của bạn, thuộc tính Time_T.sec được ánh xạ tới cột sec. Bạn có thể ánh xạ ExampleClass như thế này:

@Entity 
public class ExampleClass { 
    @Id 
    long eventId; 

    @AttributeOverrides(
     @AttributeOverride(name = "sec", column = @Column(name = "start_sec")) 
    ) 
    Time_T startTime; 
    Time_T stopTime; 
} 

Ánh xạ kết quả là startTime.sec <=> start_secstopTime.sec <=> sec. Tất nhiên bạn có thể sử dụng chú thích để tạo tên có ý nghĩa hơn cho cột stopTipe.sec.

+2

Đây rõ ràng là những gì tôi không muốn làm, vì có thể có nhiều trường hợp của mẫu này trong suốt mã. Tôi sẽ không muốn thêm vào các chú thích '@ AttributeOverrides' vài trăm lần. – VeeArr

+0

Tôi xin lỗi, tôi không chú ý đầy đủ đến thông điệp đầu tiên của bạn. Bạn đã tuyên bố rõ ràng rằng bạn không muốn ghi đè các trường theo cách thủ công. –

5

Trong trường hợp của tôi với org.hibernate: hibernate-core: 5.0.12.Final và org.springframework.boot: spring-boot-starter-data-jpa: 1.5.2.RELEASE Tôi phải thực hiện các thuộc tính sau đây trong application.properties tập tin của tôi:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
Các vấn đề liên quan