2011-12-06 1 views
0

면책 조항 : 저는 Java 개발을 처음 접했습니다. 나는 C#과 NHibernate를 많이 해왔지만이 @Attributes와 get/set 메서드는 완전히 외계 다.최대 절전 모드에서 컬렉션 속성을 직렬화하는 방법은 무엇입니까?

질문 : 나는 매우 간단한 영속 객체에게 마지막 필드가 나는에 박히면서

@Entity 
@Table(name = "ADMIN_SETTINGS") 
public class AdminSettings extends ClientEntity { 
    @Column(name = "SAMPLE_ID_PREFIX") 
    private String sampleIdPrefix; 
    @Column(name = "USE_24_Hr_CLOCK") 
    private Boolean use24hrClock; 

    private Integer[] FieldsForSampleBoxView; 
... 

매핑이있다. 그것은 최대 3 개의 정수의 단순한 목록입니다. 일대 다 테이블이 필요하지 않습니다. 전체적으로 집계 할 필요가 없습니다. 콜렉션을 db의 필드로 직렬화하면됩니다. 이상적으로는 인간이 읽을 수 있지만 솔직히 말해서 나는 상관하지 않습니다.

어떻게 매핑하나요?

답변

1

최대 3 개의 정수가 포함 된 경우이 3 개의 정수를 3 개의 열에 저장하지 않으시겠습니까? 적어도 정규화되고 질의 할 수 있어야합니다.

@Column(FIELDS_FOR_SAMPLE_VIEW_BOX) 
private String fieldsForSampleViewBox; 

public void setFieldsForSampleViewBox(Integer[] array) { 
    StringBuilder b = new StringBuilder(); 
    for (int i = 0; i < array.length; i++) { 
     if (array[i] != null) { 
      b.append(array[i]); 
     } 
     if (i < array.length - 1) { 
      b.append(','); 
     } 
    } 
    fieldsForSampleViewBox = b.toString(); 
} 

public Integer getFieldsForSampleViewBox() { 
    if (fieldsForSampleViewBox == null || fieldsForSampleViewBox.length() == 0) { 
     return new Integer[0]; 
    } 
    String[] strings = fieldsForSampleViewBox.split(","); 
    Integer[] result = new Integer(strings.length()); 
    for (int i = 0; i < strings.length(); i++) { 
     if (!strings[i].equals("") { 
      result[i] = Integer.valueOf(strings[i]); 
     } 
    } 
    return result; 
} 

당신은 또한 @Lob 주석 또는 @type (유형 = "직렬화를 사용할 수없는 경우, 단지 지속적 문자열 속성을 사용하고 게터에서이 문자열을 구문 분석하고 세터에서 문자열로 변환 ") 어노테이션을 Integer 배열에 넣지 만 네이티브 Java 직렬화가 사용되며 더 깨지기 쉽고 읽을 수 없습니다.

+0

그래서 정수 배열에 @Column ("FIELDS_FOR_SAMPLE_VIEW_BOX")'및'@Type (type = "serializable")'을 써 넣으면 작동할까요? 이 데이터 조각이 손상되어 사용자가 다시 선택해야한다면 솔직히별로 중요하지 않습니다. @ Lob/@ Type 솔루션의 모습을 포함시킬 수 있습니까? 감사! –

+0

예, 정상적으로 작동합니다. 열은 2 진 열이어야합니다. 데이터가 손상된 경우 사용자는 아무 것도 할 수 없으므로 엔티티가로드 될 때마다 예외가 throw됩니다. –

+0

아 ... 그래, 그게 확실한 문제 야. –

0

크레딧은 "hibernate persist array"에 대해 반환 된 첫 번째 링크 google로 이동합니다. this이 필요할 수 있습니다. 본질적으로, 당신은 자신의 시리얼 라이저를 Hibernate에 연결해야 할 필요가 있다고 말한다. 필자는 Hibernate 전문가가 아니기 때문에 이것을 주석으로 표현하는 방법을 모르겠습니다.

훨씬 간단하지만, 너무 우아하지 않음 : 대신, 모든 int[]를 직렬화 사용자 정의 구분 기호 (우)와 문자열, AdminSettings, 말 내부의 직렬화 된 형식에서의 데이터를 보유하지 않습니다. 또는 int[]과 직렬화 된 형식을 모두 갖지만 일관성을 유지하려면 더 많은 메모리와 CPU가 필요합니다.

+0

그래, 그게 내가 묻는 것 같아. 전에 NHibernate에서이 작업을 수행했지만 여기에 표현하는 방법은 전혀 모른다. 게다가 정수 배열을 처리 할 수있는 표준 serializer가 있기를 바랍니다. –

관련 문제