2010-01-06 23 views
3

我想添加一个对象到我的客户端视图中的集合,并使用hibernate/jpa机制将其保存在服务器上。如何简单地添加一个对象到客户端的休眠集合

问题出在这里: 取一个可以包含Account对象的Group对象。

在我的客户端视图(gwt)上,我创建了一个新组(因此id为空),并向此组添加了一些帐户(其中存在id)。但这些帐户初始化在客户端与他们的ID和伪仅通过一个建议框(因为我不想在我的客户端视图中加载密码和其他东西)

当我的小组返回到服务器,我尝试保存它与我的道,我已经得到了这个错误: 非空属性引用null或瞬时值

这是我在组对象关联:

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public Set<Account> getAccounts() 
{ 
    return accounts; 
} 

所以坚持必须自动完成。但我认为问题在于我使用具有现有ID的部分帐户对象。

我的问题是:如何添加一个简单的关联(只需在manyToMany表中添加一条记录)而不加载所有我想添加的对象(因为我不需要它,我只是想添加一个关联两者之间的ID)

编辑:举例 更多信息: 我有一组属性 ID:“G1” 名称:“1组”

我有哪些属性的帐户是 id:“A1” pseudo:“jerome” 密码:“pass1” 个状态:“已启用” 生日:“XXXX” ...

从我的客户端界面(GWT的完成)我加载组1对象 从autcompletion我加载客户对象,但只有域ID和伪(我不想加载所有的对象)。 我将ID为“A1”的Account对象“Jerome”添加到我的组中。

我将我的组发送到服务器进行保存。 在服务器我使用的通过调用保存组一个事务性方法: groupDAO.update(MyGroup1的)

如在该组对象我的账户对象被部分地加载时,它会导致错误。

那么,如何在不加载整个对象Account的情况下添加我的组和帐户之间的关联?我不希望这种代码:

List newList = new ArrayList(); 
for (Account acc : myGroup1.getAccounts()) 
{ 
    Account accLoaded = accountDAO.findById(acc.getId()); 
    newList.add(accLoaded); 
} 

myGroup1.setAccounts(newList); 
groupDAO.save(myGroup1); 

感谢

回答

4

你的目标:

I just want to add an association between two id without loading the entire object Account

你说:

I think the problem is that i use partial account objects with existing id

你是对的。假设有下面

public class Account { 

    private Integer id; 

    private Integer accountNumber; 

    @Id 
    public Integer getId() { 
     return this.id; 
    } 

    @Column(nullable=false) 
    public Integer getAccountNumber() { 
     return this.accountNumber; 
    } 

} 

所以,当你调用

Group group = new Group(); 

// Notice as shown bellow accountNumber is null 
Account account = new Account(); 
account.setId(1); 

group.addAccount(account); 

entityManager.persist(group); 

因为CascadeType.PERSIST的所以,你说

Save each referenced Account

但每次提及帐号了accountNumber属性为null。这解释了为什么你会得到你的异常

而不是加载完全初始化帐户您可以使用类似

// If you do not want to hit the database 
// Because you do not need a fully initialized Account 
// Just use getReference method 
Account account = entityManager.getReference(Account.class, new Integer(accountId)); 

所以也没有什么意义,你加载每个完全初始化的账户没有任何目的或理由。

关注,

+0

哇!正是我想要的! 非常感谢! – 2010-01-07 08:22:08

+0

+1,完美答案 – whiskeysierra 2010-01-10 19:50:15