【问题标题】:Hibernate: Duplicate entries in reference table with unique primary keyHibernate:具有唯一主键的引用表中的重复条目
【发布时间】:2014-03-04 06:37:14
【问题描述】:

我有两张表 Employee 和 Project

Table Employee
emp_id(PK- assigned)  |   emp_name   |   prj_id(FK prj_id of Project table)

Table Project
prj_id(PK- auto generated)   |    prj_name

我在员工和项目之间使用多对一关系

问题:当我运行以下代码时:

Project pro = new Project();
emp.setProject(pro);
saveDetails(emp);

public void saveEmployeeDetails( final Employee emp) 
{
    try
    {
        this.hibernateTemplate.saveOrUpdate( emp);
    }
    catch (Exception exception)
    {
        logger.info( "Unable to save details", exception );
    }
}

它正在更新 Table Employee 和 Project 但在 Project 中它正在为已经存在的相同 proj_name 创建新条目。它正在更新 Table Employee 的数据和。

由于 Employee 有自动生成的主键,而且每次保存新对象时我都会为 Project 创建新对象。如何避免重复输入,我对休眠很陌生。我对此知之甚少。

查找 hbm 文件

<class name="Employee" 
    table="employee">

    <comment>store details of a project</comment>

    <id name="employeeId" type="string">
        <column length="45" name="emp_id" />

        <generator class="assigned" />
    </id>

    <many-to-one cascade="save-update"
        class="Project" fetch="select" lazy="false"
        name="project">

        <column name="prj_id" not-null="true" />

    </many-to-one>

<class name="Project" 
    table="project">

    <id name="projectId" type="int">
        <column name="prj_id" />
        <generator class="identity" />
    </id>

            <property generated="never" lazy="false" name="projectName"
        type="java.lang.String">
        <column name="prj_name" />
    </property>

     </class>

【问题讨论】:

  • 可以使用 session 或 hibernatetemplate....获取项目名称或项目 ID 或项目对象正确如果我错了我只是一天在休眠中的 exp

标签: java sql hibernate


【解决方案1】:
Project pro = new Project();
pro.setPrj_Id(existingId);
emp.setProject(pro);

【讨论】:

  • 为了获取现有的 id,我需要进行 db 调用。有没有其他方法或选项可以指定休眠自动执行。
  • 添加到员工 hbm 文件
  • 这是更新项目表,不输入重复值,但员工表中的prj_id为空
  • 需要为员工声明分配的项目详细信息,因此您需要为项目进行数据库调用,我期待您在尝试添加员工详细信息时,您应该有项目详细信息
【解决方案2】:

SaveOrUpdate 将在没有 @ID 分配给您作为参数传递的对象时创建新实体。如果有@ID,它将执行合并操作。在您的情况下,这是 ProjectID 属性。

【讨论】:

  • 您的意思是对 Project.java 中的 projectId 属性进行注释
  • 你没有使用注释,但映射文件很好。我个人更喜欢注解。无论如何,您必须要么从数据库中提取现有项目,要么创建满足您特定要求的 UPDATE 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2016-09-22
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多