gpt4 book ai didi

java - 如何在 Hibernate 中的实体集合中添加/删除元素?

转载 作者:行者123 更新时间:2023-11-29 09:21:58 24 4
gpt4 key购买 nike

基本上,我该怎么做才能在创建人员后将新的 TestEntity 添加到测试集中?另外,如何添加一个拥有 TestEntity 集合的人?我是 Hibernate 的新手,所以我觉得我一定遗漏了一些东西,因为这似乎是一个非常常见的用例。

我尝试过的一些事情:

尝试 #1:

PersonEntity person = createPerson("username");
TestEntity test = new TestEntity();
test.setTestId("2342");
test.setTestName("test name");
personDao.add(person);
person.addTest(test);

这导致人员被保存但没有测试信息。切换 add 和 addTest 不会改变任何东西。

尝试 #2:

将这样的方法添加到我的 Dao 中(基于 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/example-parentchild.html ):

public void addTest(String personId, TestEntity test)
{
PersonEntity entity = (PersonEntity) getHibernateTemplate().getSessionFactory().getCurrentSession().load(PersonEntity.class, personId);
if (entity != null)
{
test.setPerson(entity);
entity.getTest().add(test);
getHibernateTemplate().getSessionFactory().getCurrentSession().save(entity);
getHibernateTemplate().getSessionFactory().getCurrentSession().flush();
}
}

然后这样调用:

personDao.add(person);
personDao.addTest("username", test);

但是,我得到这个错误:org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

尝试 #3:

在我的 dao 和实体类中添加了 @Transaction 注释,并在我的应用程序上下文中添加了以下配置:

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- org.springframework.transaction.jta.JtaTransactionManager org.springframework.jdbc.datasource.DataSourceTransactionManager -->
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:annotation-driven />

现在,使用我在尝试 #2 中创建的方法并以相同的方式调用它,我得到了一个 stackoverflow 错误。

编辑更新:但是,如果我从 PersonEntity 中的 hashCode 方法中删除测试集,它就可以工作。我还可以使用 person.addTest(test) ,它会在保留个人实体之前负责将集合添加到个人实体。但是,这似乎真的不是最好的方法,不是吗?完成这项工作的最佳方法是什么?我添加的那个 dao 方法似乎会进行不必要的调用?

我的类(class):

个人

 @Entity
@Table(name = "PERSON")
public class PersonEntity implements Serializable
{
private static final long serialVersionUID = -1699435979266209440L;

@Id
@Column(name = "PERSON_ID", length = 25, nullable = false)
private String personId;

@LazyCollection(value = LazyCollectionOption.FALSE)
@Cascade(CascadeType.ALL)
@OneToMany(targetEntity = TestEntity.class, mappedBy = "person")
@Where(clause="1=1")
private Set<TestEntity> test;

public void addTest(TestEntity testEntity)
{
testEntity.setPerson(this);
test.add(testEntity);
}

}

测试

@Entity
@Table(name = "TEST")
public class TestEntity implements Serializable
{
private static final long serialVersionUID = -6524488155196023818L;

@Id
@Column(name = "TEST_ID", length = 36, nullable = false)
private String testId;

@ManyToOne
@Cascade(CascadeType.ALL)
@Index(name = "TEST_PERSON_ID_INDEX")
@JoinColumn(name = "PERSON_ID")
@ForeignKey(name = "FKT1_PERSON_ID")
private PersonEntity person;

@Column(name = "TEST_NAME", length = 60, nullable = false)
private String testName;
}

PersonDao hibernate

public class PersonDaoHibernate extends HibernateDaoSupport implements PersonDao
{
public String add(PersonEntity person)
{
getHibernateTemplate().merge(person);
return person.getPersonId();
}

public void delete(String id)
{
Object entity = getHibernateTemplate().get(PersonEntity.class, id);
if (entity != null)
{
getHibernateTemplate().delete(entity);
}
}

public PersonEntity getById(String id)
{
return getHibernateTemplate().get(PersonEntity.class, id.toUpperCase());
}

}

最佳答案

我认为您必须将方法名称更改为 setTest(...),因为 hibernate 在尝试对属性进行操作时遵循 java bean 约定。改变它,我希望它能正常工作。其余代码看起来不错。

关于java - 如何在 Hibernate 中的实体集合中添加/删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844952/

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