gpt4 book ai didi

java - Hibernate:双向一对多外键约束失败

转载 作者:行者123 更新时间:2023-11-30 11:49:41 25 4
gpt4 key购买 nike

我想使用 Hibernate(在 Java 中)实现一对多关系。我有两个实体:

  • 实验
  • 实验组

Experiment 有很多 ExperimentGroups。我尝试配置这种一对多关系,Hibernate 官方文档推荐的方式:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/example-parentchild.html#example-parentchild-cascades

我的配置文件:

<class name="ExperimentImpl" table="Experiment">
<id name="id" type="int" column="id">
<generator class="increment" />
</id>
<!-- One to Many -->
<set name="experimentGroups" table="ExperimentGroup"
lazy="false" fetch="select" cascade="all" inverse="true">
<key>
<column name="Experiment_id" not-null="true" />
</key>
<one-to-many class="ExperimentGroupImpl" />
</set>
</class>
<class name="ExperimentGroupImpl" table="ExperimentGroup">
<id name="id" type="int" column="id">
<generator class="increment" />
</id>
<many-to-one name="experiment" class="ExperimentImpl" fetch="select">
<column name="Experiment_id" not-null="true" />
</many-to-one>
</class>

将新的 ExperimentGroup 添加到 Experiment 工作正常,但删除 Experiment(及其所有 ExperimentGroups)会导致异常:

Cannot delete or update a parent row: a foreign key constraint fails (testdb.ExperimentGroup, CONSTRAINT FK9C71D86238B5500C FOREIGN KEY (Experiment_id) REFERENCES Experiment (id))

我的 ExperimentDAO 代码如下所示:

public void deleteExperiment(Experiment experiment) 
throws DAOException
{
Session session = null;
Transaction t = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
t = session.beginTransaction();
session.delete(experiment);
t.commit();
session.flush();
session.close();
}catch (HibernateException e)
{
e.printStackTrace();
if (t != null)
t.rollback();

if (session != null)
session.close();

throw new DAOException(e, "Could not delete Experiment");
}
}

编辑:用于创建实验和实验组的 DAO 代码:

public Experiment createExperiment(String name, String description, RegisteredUser owner)
{
Transaction tx = null;
Session session = null;
try
{
session = HibernateUtil.getSessionFactory().openSession();

tx= session.beginTransaction();
ExperimentImpl e = new ExperimentImpl();

e.setName(name);
e.setDescription(description);
e.setOwner(owner);

owner.getOwnedExperiments().add(e);

session.save(e);
tx.commit();
session.flush();
session.close();

return e;
} catch (HibernateException ex )
{
if (tx != null)
tx.rollback();

if (session!=null)
session.close();

throw ex;
}
}




public ExperimentGroup createAndAddExperimentGroup(Experiment experiment, String experimentGroupName, Date startDate, Date endDate) throws ArgumentException
{

Transaction t = null;
Session session = null;

try
{
session = HibernateUtil.getSessionFactory().openSession();
t = session.beginTransaction();
ExperimentGroupImpl g = new ExperimentGroupImpl();
g.setEndDate(endDate);
g.setStartDate(startDate);
g.setName(experimentGroupName);
g.setExperiment(experiment);

experiment.getExperimentGroups().add(g);
g.setExperiment(experiment);

session.save(g);
session.update(experiment);
t.commit();
session.flush();
session.close();

return g;

}catch(HibernateException e)
{
if (t!=null)
t.rollback();

if (session!= null)
session.close();

throw e;
}
}

实验还有许多其他属性,例如名称、描述等,我已将其从配置文件中删除,因为它们对一对多关系没有影响。

有什么建议吗?我做错了什么?

最佳答案

我的印象是您正在尝试删除您手动创建的分离实体。我会尝试使用要删除的实验的主键,并在实际删除它之前加载:

session = HibernateUtil.getSessionFactory().openSession();
t = session.beginTransaction();
ExperimentImpl persistentExperiment = session.load(ExperimentImpl.class, experiment.getId());
session.delete(persistentExperiment);
t.commit();

关于java - Hibernate:双向一对多外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281769/

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