2010-03-08 17 views
6

Chúng tôi có một số cột có dữ liệu phải luôn ở dạng chữ hoa để đảm bảo tính duy nhất. Tôi đã tự hỏi nếu hibernate có thể buộc tất cả các cột như vậy để chữ hoa thông qua một số thay đổi tập tin cấu hình?Có thể Hibernate tự động viết hoa một cột trên đọc/chèn thông qua cấu hình không?

Chúng tôi thực sự sử dụng một loại người dùng tùy chỉnh để mã hóa/giải mã dữ liệu cột cho một số bảng khác, nhưng tôi đoán rằng sẽ là quá mức cần thiết chỉ để chữ hoa tất cả mọi thứ ...

Ngoài ra, tôi đã suy nghĩ về việc sửa đổi các mô hình như vậy tất cả các getters/setters sẽ viết hoa bất kỳ chuỗi nào đến và đi.

Kịch bản trường hợp xấu nhất (?) Là sửa đổi ràng buộc cột Oracle để bỏ qua trường hợp khi kiểm tra tính duy nhất.

Mọi suy nghĩ?

Trả lời

1

tôi quyết định thực hiện một loại người dùng ... đó là càng gần đến một cấu hình hibernate như tôi có thể nhận được ... đây là mã ...

package model; 

import java.io.Serializable; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 

import org.apache.commons.lang.builder.EqualsBuilder; 
import org.apache.commons.lang.builder.HashCodeBuilder; 
import org.hibernate.Hibernate; 
import org.hibernate.HibernateException; 
import org.hibernate.usertype.UserType; 

public class UpperCaseUserType implements UserType { 
    private static final int[] TYPES = {Types.VARCHAR}; 

public int[] sqlTypes() { 
     return TYPES; 
} 

public Class returnedClass() { 
     return String.class; 
} 

public boolean equals(Object x, Object y) throws HibernateException { 
     if (x == y) { 
      return true; 
     } 
     if (null == x || null == y) { 
      return false; 
     } 
     return new EqualsBuilder().append(x, y).isEquals(); 
} 

public int hashCode(Object o) throws HibernateException { 
     return new HashCodeBuilder().append(o).toHashCode(); 
} 

public Object nullSafeGet(ResultSet resultSet, String[] strings, Object object) throws HibernateException, SQLException { 
     return ((String) Hibernate.STRING.nullSafeGet(resultSet, strings[0])).toUpperCase(); 
} 

public void nullSafeSet(PreparedStatement preparedStatement, Object object, int i) throws HibernateException, SQLException { 
     String string = ((String) object).toUpperCase(); 
     Hibernate.STRING.nullSafeSet(preparedStatement, string, i); 
} 

public Object deepCopy(Object o) throws HibernateException { 
     if (null == o) { 
      return null; 
     } 
     return new String(o.toString()); 
} 

public boolean isMutable() { 
     return false; 
} 

public Serializable disassemble(Object o) throws HibernateException { 
     return (String) o; 
} 

public Object assemble(Serializable serializable, Object o) throws HibernateException { 
     return serializable; 
} 

public Object replace(Object o, Object arg1, Object arg2) throws HibernateException { 
     return o; 
} 
} 

xem xét yếu tố khách sạn này

<property name="serialNumber" type="model.UpperCaseUserType"> 
    <column name="SERIAL_NUMBER" length="20" not-null="true" unique="true" /> 
</property> 

Vì vậy, lý do ... Như hibernate chèn dữ liệu, loại này sẽ chuyển đổi chuỗi thành chữ hoa. Khi hibernate chọn dữ liệu, điều tương tự cũng xảy ra. Ưu điểm của lớp này chỉ thay đổi việc lấy/thiết lập của bean thành chữ hoa là khi tôi sử dụng một tiêu chí để chọn trên serialNumber. Hibernate cũng sẽ viết hoa tham số của tôi vì nó sẽ truyền/áp dụng cùng loại như được định nghĩa trong cấu hình bảng.

Vì vậy, tôi không cần phải nhớ viết hoa tất cả các tiêu chí tìm kiếm của tôi cho số sê-ri ... hibernate chăm sóc điều đó cho tôi ... đó là chính xác những gì tôi đang cố gắng đạt được ở đây!

Tôi có một JUnit thể hiện tất cả các công cụ này, nhưng tôi nghĩ rằng câu trả lời của tôi là quá lớn vì nó là ...

1

Tôi không biết bất kỳ cài đặt cấu hình nào để thực hiện việc này. Tuy nhiên, bạn có thể thử sử dụng một interceptor để sửa chữa dữ liệu khi chèn/cập nhật, như:

package interceptor; 

import java.io.Serializable; 

import org.hibernate.EmptyInterceptor; 
import org.hibernate.type.Type; 

public class CustomSaveInterceptor extends EmptyInterceptor { 
    public boolean onSave(Object entity, 
     Serializable id, 
     Object[] state, 
     String[] propertyNames, 
     Type[] types) 
    { 
     if (entity instanceof MyClass) { 
      MyClass myInstance = (MyClass)entity; 
      myInstance.setName(myInstance.getName().toUpperCase()); 
     } 
     return super.onSave(entity, id, state, propertyNames, types); 
    } 
} 
+0

Tôi có một đánh chặn chứa khác "công cụ" mà tôi có thể thả ý tưởng của bạn vào ... nhưng tôi không thấy viết một lô nếu logic cho hàng chục lớp hay như vậy cần một số lĩnh vực của họ để được viết hoa. –

0

tôi khuyên bạn nên xem trang này: http://forum.springsource.org/archive/index.php/t-18214.html

Nó có 3 cách khác nhau để làm điều này. Tôi tin rằng con đường xâm nhập ít nhất là thế này:

<property name="upperCaseName" formula="upper(name)" lazy="true"/> 
+1

Tôi có thể sai nhưng tôi không nghĩ rằng công thức lừa sẽ làm việc cho chèn hoặc cập nhật (Tôi nghĩ rằng Hibernate xử lý các lĩnh vực fomula như thoáng qua và không lưu chúng trong cơ sở dữ liệu). –

3

Một số giải pháp:

  1. Sử dụng một cơ sở dữ liệu kích hoạt (không thông qua cấu hình mặc dù).
  2. Sửa đổi bộ thu thập/cài đặt (không qua cấu hình).
  3. Sử dụng UserType để chuyển đổi thuộc tính sang chữ hoa.
  4. Sử dụng interceptor hoặc event listener.

Giải pháp # 1 là minh bạch cho mã nhưng tôi không phải là người hâm mộ lớn "phía sau lưng" và tôi không muốn truyền bá quy tắc kinh doanh ở mọi nơi. Giải pháp # 3 và # 4 là phụ thuộc vào Hibernate (nhưng điều này có thể không phải là một vấn đề). Giải pháp # 2 là giải pháp dễ dàng và dễ dàng nhất nếu bạn có thể thay đổi mã. Đó sẽ là lựa chọn của tôi nếu đây là một lựa chọn.

+0

Tôi cũng đang nghiêng về phía # 2, nhưng tôi đang tìm kiếm một cấu hình ngủ đông có thể "hoạt động" ... –

+0

@T Reddy Không có gì giống như vậy trong hộp AFAIK. –

2

nhiều bụi cách tiếp cận:

@Column(name = "DUMMY") 
@ColumnTransformer(read = "UPPER(DUMMY)") 
private String dummy 
Các vấn đề liên quan