2014-05-13 1 views
0

필드의 읽기를 비활성화 , "사용자"는 많은 "파일"을 가질 수 있습니다.ORMlite 내가 2 개체와 ORMLITE을 사용하고

List<User>  users; 
Dao<User, ?> daoUser; 

users = daoUser.queryForAll(); 
System.out.println(users); 

System.out.println(users.files.get(0)); 

컬렉션 "파일"내부 개체 "사용자"가 인스턴스화 : "파일"에 액세스하기 위해, 나는 항상 그와 같은 객체 "사용자"를 사용합니다. 나는 싫어!

"User.files.get(0).user"을 null로 지정합니다.

ORMLite에서 필드 읽기를 비활성화하려면 어떻게해야합니까?

+0

질문이 명확하지 않습니다. 일대 다 연결을 만들려고하십니까? 1 명의 사용자가 많은 파일을 가지고있을 수 있습니까? – jdiver

+0

바로. 내 질문을 편집했습니다. 더 분명해야합니다. – LOLKFC

답변

1

컬렉션 "파일"내부 개체 "사용자"인스턴스화됩니다. 나는 싫어!

ORMLite에서 필드 읽기를 비활성화하려면 어떻게해야합니까?

당신은이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

  1. 당신은 대신 User 필드의 int user_id 필드가 다음이 user_id에서 자신의 데이터베이스에서 hygrade 아닌 데이터베이스 필드 User을 가질 수 있습니다. 당신이 할 수있는

  2. 또 다른 것은user_id 열을 제외한 열 을 모두 선택합니다 queryBuilder.selectColumns(...)을 사용하는 것입니다. 선택에서 user_id을 반환하지 않으면 User 인스턴스가 인스턴스화되지 않습니다. user 필드를 @DatabaseField으로 표시하면 ORMLiteuser_id 또는 그 이상으로 변경됩니다.

  3. dao.queryForRaw(...) 메서드를 사용하고 결과에서 user_id 열을 무시한 자신의 RawRowMapper을 사용하여 직접 클래스 변환을 수행 할 수 있습니다.여담으로

, 나는 왜 당신이 User 인스턴스화하지 않으 을 요청할 수 있습니다? 이것이 메모리 문제입니까?

+0

감사합니다. 두 가지 이유가 있습니다. 1/Google에서 GSON의 순환 참조가 있습니다. 2/REST를위한 것입니다. 사용자를 읽을 때 파일에서 사용자에 대한 참조를 원하지 않습니다 (이미 사용자를 알고 있습니다). – LOLKFC

1

클래스 정의에 오류가있어 클래스가 일대 다 연결을한다고 생각합니다.

ormlite.com 설명서를 확인하십시오. 특히 eagerforeignAutoRefresh 부분을 확인하십시오.

사용자 :

@DatabaseTable(tableName = "user") 
public class User { 

    @DatabaseField(columnName = "id", generatedId = true, index = true) 
    public int  id; 

    @ForeignCollectionField(eager = false) 
    public Collection<File> files; 
} 

파일 :

@DatabaseTable(tableName = "file") 
public class File { 

    @DatabaseField(columnName = "id", generatedId = true, index = true) 
    public int  id; 

    @DatabaseField(columnName = "id", foreign = true, foreignAutoRefresh = false) 
    public User   user; 

    @DatabaseField(columnName = "filename") 
    public String  filename; 

} 
+0

이 코드에서는 "User"클래스의 "File"컬렉션에있는 "User"가 인스턴스화됩니다. – LOLKFC