2010-01-11 52 views
1

我對使用java和google appengine數據存儲還是比較新的。關鍵字和appengine數據存儲中的獨特行

我可以將數據放入數據存儲中並將其從數據存儲中取出,並且我正在嘗試使用戶無法輸入兩次。 由於數據存儲上沒有唯一索引,因此我將用戶電子郵件地址的散列設置爲主鍵。奇怪的是,當我多次輸入相同的數據時,它被輸入到數據存儲區(我認爲它會返回一個錯誤,或者什麼都不做)。

因此,當我將我的emailhash設置爲'2'進行測試,然後運行插入腳本一堆,並查詢WHERE _emailHash ='2',我得到3個結果。

這裏是我定義用戶的類。

 
@Entity 
public class user 
{ 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long _uid; 

@PrimaryKey 
private String _emailHash; 

private String _firstName; 

private String _lastName; 

private String _email; 

private String _password; 

public Long getUid() 
{ 
    return _uid; 
} 

public String getEmailHash(){ 
    return _emailHash; 
} 
public void setEmailHash(String emailHash) 
{ 
    _emailHash = emailHash; 
} 

public String getFirstName() 
{ 
    return _firstName; 
} 
public void setFirstName(String firstName) 
{ 
    _firstName = firstName; 
} 
public String getLastName() 
{ 
    return _lastName; 
} 
public void setLastName(String lastName) 
{ 
    _lastName = lastName; 
} 

public String getEmail() 
{ 
    return _email; 
} 
public void setEmail(String email) 
{ 
    _email = email; 
} 
public String getPassword() 
{ 
    return _password; 
} 
public void setPassword(String password) 
{ 
    _password = password; 
} 
} 

在谷歌文檔說以下

 
an entity ID ("key name") provided by the application when the object is created. Use this for objects without entity group parents whose IDs should be provided by the application. The application sets this field to the desired ID prior to saving. 
import javax.jdo.annotations.PrimaryKey; 

// ... 
    @PrimaryKey 
    private String name; 

http://code.google.com/appengine/docs/java/datastore/creatinggettinganddeletingdata.html

有沒有更好的辦法保證不重複?或者我必須在插入前檢查每個值是否存在?

-------------------------- UPDATE ------------------- --------------------------- 根據德米特里的迴應,我混合了JPA和JDO(或者至少弄混了這兩者)。現在,我已經得到了整理出來,我哈希處理的電子郵件的定義是這樣的

 
@Id 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String _emailHash; 

@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long _uid; 

努力與

 
$pm = EMF::createEntityManager(); 
$user = new user(); 
$user->setEmailHash('5'); 
$user->setFirstName('test5'); 
$user->setLastName('test5'); 
$user->setEmail('test5'); 

$pm->persist($user); 

我收到以下錯誤,用戶不幸的是,當

 
Invalid primary key for com.nextweeq.scheduler.user. The primary key field is an encoded String but an unencoded value has been provided 

到目前爲止,我的搜索正在返回一些關於指定鍵名的內容,但我還沒有完全找到解決方案。你指的是

回答

1

文件是關於JDO,而你的代碼似乎使用JPA其中@Id起着相同的作用@PrimaryKey在JDO

扮演
+1

感謝德米特里,可能已經第一個問題,但與使用「數據存儲區中相應的實體」的沒有一個名字,我不知道現在我收到錯誤我完全明白。 – pedalpete 2010-01-12 01:15:21

0

您可以使用鍵以檢索數據:

import com.google.appengine.api.datastore.Key; 
import com.google.appengine.api.datastore.KeyFactory; 

Key k = KeyFactory.createKey(user.class.getSimpleName(), "[email protected]"); 

PersistenceManager pm = PMF.get().getPersistenceManager(); 
user usr = pm.getObjectById(user.class, k); 

來源:appengine docs

+0

我不確定你在克里斯蒂安得到什麼。如何使用密鑰來檢索與使用數據相關的數據作爲密鑰?我試圖將用戶數據設置爲關鍵字,而不是基於關鍵字檢索數據。 – pedalpete 2010-01-12 01:33:00

+0

以同樣的方式回顧可以作爲一個關鍵。 Key k = KeyFactory.createKey(user.class.getSimpleName(),「[email protected]。COM「); 引用谷歌文檔: 」密鑰可以使用的KeyFactory類的keyToString()和stringToKey()方法,分別被轉換成從一個字符串表示。 (請注意,這與Key類的toString()方法不同,後者返回適合調試的人類可讀值。)「 – 2010-01-12 15:15:08

相關問題