2009-02-05 44 views
7

Để xác thực dữ liệu tôi nhận được, tôi cần đảm bảo rằng độ dài sẽ không vượt quá độ dài cột cơ sở dữ liệu. Bây giờ tất cả các thông tin chiều dài được lưu trữ trong các tập tin bản đồ Hibernate, có anyway để truy cập thông tin này lập trình?Lấy chiều dài cột từ ánh xạ Hibernate?

+0

Xem thêm http://stackoverflow.com/questions/1816780/ để có giải pháp JPA cho vấn đề này. –

Trả lời

6

Bạn có thể truy cập nó nhưng không dễ dàng. Bạn có thể muốn làm một cái gì đó như dưới đây lúc khởi động và lưu trữ một bộ nhớ cache tĩnh của các giá trị. Có rất nhiều trường hợp đặc biệt để xử lý (thừa kế, vv), nhưng nó sẽ làm việc cho ánh xạ một cột đơn giản. Tôi có thể đã bỏ qua một số kiểm tra instanceof và null.

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) { 
    PersistentClass persistentClass = (PersistentClass)iter.next(); 
    for (Iterator iter2=persistentClass.getPropertyIterator(); iter2.hasNext();) { 
     Property property = (Property)iter2.next(); 
     String class = persistentClass.getClassName(); 
     String attribute = property.getName(); 
     int length = ((Column)property.getColumnIterator().next()).getLength(); 
    } 
    } 
+0

Tôi sẽ phải thử cái này, cảm ơn Brian. –

6

Dựa trên câu trả lời của Brian, đây là những gì tôi đã kết thúc.

private static final Configuration configuration = new Configuration().configure(); 

public static int getColumnLength(String className, String propertyName) { 
    PersistentClass persistentClass = configuration.getClassMapping(className); 
    Property property = persistentClass.getProperty(propertyName); 
    int length = ((Column) property.getColumnIterator().next()).getLength(); 

    return length; 
} 

Điều này có vẻ hoạt động tốt. Hy vọng điều này là hữu ích cho bất cứ ai tình cờ khi câu hỏi này.

+0

Với Hibernate 5 lấy PersistentClass như thế này (thay vì thông qua Configuration): 'StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(). Configure (" hibernate.cfg.xml "). Build(); Siêu dữ liệu metaData = new MetadataSources (standardRegistry) .getMetadataBuilder(). Build(); Danh sách persistentClasses = new ArrayList (metaData.getEntityBindings()); ' – olivmir

1

Đôi khi có thể có vấn đề khi nhận đối tượng Cấu hình (nếu bạn đang sử dụng một số khung ứng dụng và bạn không tự tạo nhà máy phiên sử dụng Cấu hình).

Nếu bạn đang sử dụng ví dụ Spring, bạn có thể sử dụng LocalSessionFactoryBean (từ applicationContext của bạn) để lấy đối tượng Configuration. Sau đó, lấy chiều dài cột chỉ là miếng bánh;)

factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength() 
1

Tuy nhiên, khi tôi cố gắng để truy cập LocalSessionFactoryBean, tôi phải mất một ngoại lệ lớp diễn viên

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("sessionFactory"); 

ngoại lệ:

org.hibernate.impl.SessionFactoryImpl cannot be cast to org.springframework.orm.hibernate3.LocalSessionFactoryBean 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean> 

Điều này có vẻ sai lệch ....

EDIT: tìm thấy câu trả lời. Bạn cần phải sử dụng một dấu ở phía trước của chuỗi tên đậu

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory"); 

see this Spring forum post

3

mô hình phát triển ưa thích của tôi là để căn chiều dài cột vào một hằng số, có thể dễ dàng tham chiếu:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

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