2008-12-17 38 views
10
@Column(name="DateOfBirth") 
private Date dateOfBirth; 

Tôi đặc biệt cần mã trên để tạo cột có tên "DateOfBirth", thay vào đó Hibernate cung cấp cho tôi cột có tên date_of_birth. Làm thế nào tôi có thể thay đổi điều này? Có một thuộc tính web.xml không? Tôi đi qua DefaultNamingStrategy và ImprovedNamingStrategy, nhưng không chắc chắn làm thế nào để xác định một hay khác.Các vấn đề về tên cột ngủ đông

+0

Có thể làm việc. Nếu bạn đặt tên cho nó ngày sinh thì cột trong DB sẽ được đặt tên như vậy, nhưng tên thuộc tính phải giống nhau. – OscarRyz

+0

cuộc gọi tốt - điều này đã hiệu quả. Cảm ơn! – lucas

+0

Hãy để tôi đặt nó như là một câu trả lời sau đó :) – OscarRyz

Trả lời

5

Đây là giải pháp khả thi: nếu bạn đặt tên là dateofbirth thì cột trong DB sẽ được đặt tên như vậy, nhưng tên thuộc tính phải giống nhau.

Hibernate có định dạng kiểu lạc đà để tạo/đọc cột cơ sở dữ liệu.

Tôi đã gặp sự cố này trước đây. Tôi đã làm việc với một cột di sản mà không có không gian trong các tên cột "employeen", "employeer", "departmentlocation". Tôi ghét nó vì tất cả các đặc tính đậu của tôi phải không có vỏ lạc đà.

Cột cơ sở dữ liệu được phân tách bằng dấu "_" sẽ được sử dụng để camelCase đúng cách như bạn vừa thấy.

0

Tôi không chắc chắn 100%, nhưng bạn không cần phải chú thích phương thức get chứ không phải biến riêng tư?

+0

Tôi không nghĩ như vậy?Ít nhất, tôi có thể chỉ định những thứ như độ dài ở cấp độ biến mẫu và chúng sẽ thay đổi các cột tương ứng .. – lucas

+0

Bạn có thể chú thích một trong hai, nhưng bạn phải chú thích chúng một cách nhất quán. Nếu bạn trộn chúng và chú thích một số tiêu đề và một số getters, nó sẽ tìm thấy một và bỏ qua khác. –

6

Đặt chú thích @column trên getter:

@Column(name="DateOfBirth") 
public Date getDateOfBirth() { 
... 
} 
+1

điều này làm việc cho tôi – chaostheory

1

Bạn có thể chú thích một trong hai lĩnh vực hoặc các phương pháp getter, nó không tạo sự khác biệt. Bạn có thể đăng tệp hibernate.cfg.xml hoặc persistence.xml đầy đủ của mình không?

1

Cách giải quyết được đề xuất là sử dụng @Column (name = "dateofbirth"), hoạt động cho mục đích của tôi.

+0

Bạn có nói rằng thay đổi duy nhất bạn thực hiện là viết hoa không? –

+0

Vâng. Có vẻ như ImprovedNamingStrategy là thủ phạm, trong đó thấy tên cột camelcase và chuyển thành chữ thường + dấu gạch dưới. Lỗi hoặc tính năng, bạn quyết định. – lucas

22

FYI: Lý do chèn dấu gạch dưới có thể là do bạn đang sử dụng ImprovedNamingStrategy. Nó được đặt trên đối tượng Configuration của bạn. Xem here để biết ví dụ ...

Nếu bạn không muốn dấu gạch dưới, bạn không thể đặt chiến lược đặt tên hoặc đặt chiến lược đó thành DefaultNamingStrategy bạn đã phát hiện trước đó.

+0

Đó chính xác là nguyên nhân của vấn đề này. Làm việc như một sự quyến rũ đối với tôi. –

4

ImprovedNamingStrategy có phương pháp addUnderscores() được gọi là từ tableName() và ColumnName() bạn có thể thực hiện lớp chiến lược đặt tên riêng của bạn và ghi đè lên những theo sự lựa chọn của bạn

public class MyOwnNamingStrategy extends ImprovedNamingStrategy { 
     @Override 
     public String tableName(String tableName) { 
     //return addUnderscores(columnName); // skip this 
     return columnName; // if you want column name variable name same 
     //return changeAsYouWant(columnName); // as name sames 
     } 
    } 
+0

Tôi cũng khuyên bạn nên gọi "super (tableName)" trên bất kỳ tablenames nào bạn không cần quy ước đặc biệt của bạn ... có thể – willsteel

2

Hãy thử đặt này trong

application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
+0

Điều này làm việc cho tôi trong một ứng dụng Khởi động mùa xuân. –

0

thêm thuộc tính bên dưới vào trường hợp khởi động mùa xuân.

spring.jpa.hibernate.naming.implicit-chiến lược = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-chiến lược = org.hibernate.boot.model.naming .PhysicalNamingStrategyStandardImpl

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