gpt4 book ai didi

java - 如何从客户端简单地将对象添加到 hibernate 中的集合

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:18 25 4
gpt4 key购买 nike

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

问题来了:取一个可以包含帐户对象的组对象。

在我的客户端 View (gwt) 上,我创建了一个新组(因此 id 为空)并向该组添加了一些帐户(其中存在 id)。但是这些帐户仅通过建议框在客户端使用其 ID 和伪造进行初始化(因为我不想在客户端 View 中加载密码和其他内容)

当我的组返回到服务器时,我尝试用我的 dao 保存它,但我遇到了这个错误:not-null 属性引用了 null 或 transient 值

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

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

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

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

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

我有属性的帐户编号:“A1”伪:“杰罗姆”密码:“pass1”状态:“启用”生日:“xxxx”...

从我的客户端界面(使用 gwt 完成)我加载了 group1 对象我从自动完成加载帐户对象,但只加载字段 id 和伪(我不想加载所有对象)。我将 ID 为“A1”的帐户对象“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);

谢谢

最佳答案

你的目标:

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 属性都是空的。它解释了为什么你会得到你的异常(exception)

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

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

因此,无缘无故地加载每个完全初始化的帐户是没有意义的。

问候,

关于java - 如何从客户端简单地将对象添加到 hibernate 中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com