【问题标题】:how to simple add an object to a collection in hibernate from client如何从客户端简单地将对象添加到休眠中的集合
【发布时间】:2010-01-06 10:29:18
【问题描述】:

我正在尝试将对象添加到客户端视图中的集合中,并使用 hibernate/jpa 机制将其保存在服务器上。

问题来了: 获取一个可以包含 Account 对象的 Group 对象。

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

当我的组返回服务器时,我尝试使用我的 dao 保存它,但出现此错误: 非空属性引用空值或瞬态值

这是我在 Group 对象中的关联:

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

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

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

编辑: 通过示例获取更多信息: 我有一组属性是 编号:“G1” 名称:“组1”

我已经知道了哪些属性的帐户 编号:“A1” 伪:“杰罗姆” 密码:“pass1” 状态:“启用” 生日:“xxx” ...

从我的客户端界面(使用 gwt 完成)我加载 group1 对象 从自动完成中,我加载 Account 对象,但仅使用字段 id 和伪(我不想加载所有对象)。 我将 ID 为“A1”的 Account 对象“Jerome”添加到我的组中。

我将我的组发送到服务器以保存它。 在服务器中,我使用一种事务方法,通过调用来保存组: groupDAO.update(myGroup1)

由于我在此 Group 对象中的 Account 对象已部分加载,因此会导致错误。

那么,如何在不加载整个对象 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);

谢谢

【问题讨论】:

    标签: java hibernate gwt jpa many-to-many


    【解决方案1】:

    你的目标:

    我只想在两个id之间添加一个关联而不加载整个对象Account

    你说:

    我认为问题在于我使用部分帐户对象和现有 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,你在说

    保存每个引用的帐户

    但是每个引用的 Account accountNumber 属性都是空的。它解释了为什么你会得到你的例外

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

    // 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));
    

    因此,没有任何目的或理由加载每个完全初始化的帐户是没有意义的。

    问候,

    【讨论】:

    • 哇!正是我想要的!非常感谢!
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多