2011-08-03 2 views
0

최대 절전 모드를 사용하여 Java EE 애플리케이션의 전역 데이터를 저장하는 최상의 솔루션을 찾고 있습니다. 키 값 쌍으로 구성됩니다. 예 :Hibernate를 사용하여 J2EE App에 전역 데이터를 저장하는 모범 사례

projectStarted = "10-11-11" 
developerNumber = 3 
teamLeader = "John" 

이 모든 항목에는 다른 유형이 있습니다.

지금은 두 가지 옵션이 있습니다.

1) GlobalData 엔티티를 만듭니다. 각 필드는 테이블의 고유 한 열로 표시되며 고유 한 설정을 포함합니다. 이 방법은 형식 캐스팅에 아무런 문제가 없지만 많은 양의 설정이있을 경우에는 피하고 싶습니다.

2) 설정 엔티티를 생성하십시오. 각 키에는 키 (기본 키)와 값이라는 두 개의 필드가 포함되며 테이블의 고유 레코드로 표시됩니다. 이것은 바람직한 해결책이지만 설정이 모든 유형이 될 수 있기 때문에 많은 유형 캐스팅을 얻게됩니다.

그래서 기본적으로 다른 유형의 문제를 많이 겪지 않고 두 번째 솔루션을 구현하는 방법을 찾고 있습니다. 아무도 나를 도울 수 있습니까?

감사합니다.

편집 1.

네, 덕분에 기독교. 그냥 비슷한 생각이 들었어.

내가 같은 것입니다 설정 엔티티해야합니다 경우 :

@Entity 
@Table(name = "settings") 
public class Setting { 

    @Column 
    private String key; 
    @Column 
    private String value; 
    @Column 
    private String converterClassFullName; //example by.lugovsky.MyConverter 

    //Getters, setters 
} 

그리고 GlobalData에 클래스를.

public class GlobalData { 
    private Date projectStarted; 

    private int developerNumber; 

    private String teamLeader; 

    Set<Setting> settings; 

    //Getters and setters for all, except settings. 

} 

그래서 기본적으로 내 생각은 등/업데이트/내가 내 DAO에서이 작업을 수행 할 수 있습니다 지속하기 전에 개체를 설정 변환하는 것입니다,하지만 난 @Entity 주석과 GlobalData에 클래스에 주석을 달 수 있다면 만들지 않고뿐만 아니라, 궁금 해서요 새 테이블. 이 방법으로 OneToMany 주석을 Setting으로 설정하고 내부 @PrePersist 등의 메소드에서 변환을 수행 할 수 있습니다.

최대 절전 모드로 설정할 수 있습니까?

다시 한번 감사

+0

속성 파일에 아주 쉽게 저장할 수있는 것처럼 보입니다. 당신은 여전히 ​​타입 안전 접근을 위해 빈을 감쌀 수있다. 쉽게 확장하고 업데이트하기 쉽습니다. – Caps

+0

물론, 문제는 이러한 값을 변경하기 위해 GUI를 제공해야한다는 것입니다. 그래서 나는 이것을 DB에 저장하려고합니다. –

답변

1

당신은 DB에 변환기 클래스를 저장할 수 있고는 값을 사용하기 전에 속성에 주어진 변환을 통해 실행하자. JSF는 컨버터의 API를 제공

public interface Converter{ 
    public Object getAsObject(FacesContext fc, UIComponent component, String value) throws ConverterException; 

    public String getAsString(FacesContext fc, UIComponent component, Object obj) throws ConverterException; 
} 

당신은

이름의 스키마가있는 경우 : 문자열을

값 : 문자열

계산기 : 클래스

당신이 뭔가를 할 수 있습니다 :

PropertyEntry pe = // Get from OR-Mapper 
Converter c = (Converter) pe.getConverter().newInstance(); 
Object o = c.getAsObject(null, null, pe.getValue()); 
// use the object o instead of value 

더 차가워지기 위해서 클래스 내에서 필드 내에서 변환 된 값을 유지하는 데 사용할 수있는 지속되지 않는 필드를 정의 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 편집을 참조하십시오. –

+0

그것이 작동하는지 확실하게 말할 수는 없지만 그렇게하지 않을 것이라고 생각합니다. 당신은 정말로 그것을 시험해보아야하지만 충분히 유연하지는 않습니까? 이러한 일반적인 접근법을 과장하지 않으려 고 노력하면 곧 매우 까다로워 질 것입니다. 당신이 그것을 시도했을 때 알려주십시오! –

+0

나는 그것을 결국 시도했다. 그러나 나는 Hibernate가 여분의 테이블을 생성하지 않고 이것을 처리하도록하지 않았다. 그래서 나는 생각했던 것처럼 Dao에서 필요한 모든 전환을 수행하고 있습니다. Dao는 변환 논리를 캡슐화하고 서비스 수준에서 어떻게 생성되었는지를 모른 채 GlobalData 인스턴스로 작업 할 수 있습니다. 전역 데이터 클래스의 필드를 액세스하고 변환하기 위해 리플렉션을 사용하고 있습니다. 이렇게하면 GlobalData에 새 필드를 추가하기 만하면 데이터베이스에 새 레코드를 추가 할 수 있습니다. 제거 필드는 또한 DB에서 레코드를 제거합니다. 고마워. 고마워. –

관련 문제