当前位置: 首页 > 知识库问答 >
问题:

hibernate外键映射到唯一键

卜昂熙
2023-03-14

我正在尝试我们非主键作为外键在我的应用程序。场景如下:我有EMPLOYEE和EMPLOYEE_PROPERTIES表。Employee和Employee属性之间存在一对多的关系。下面是我的架构:

create table employee(
 fname varchar2(100) not null,
 lname varchar2(100) not null,
 emp_id number not null
);
ALTER TABLE employee ADD constraint employee_pk PRIMARY KEY (fname, lname);
alter table employee add constraint employee_uniue unique (emp_id);

create table employee_property(
 emp_prop_id not null,
 emp_id number not null,
 property_name varchar2(100) not null,
 property_value varchar2(100) not null
);
ALTER TABLE employee_property ADD constraint employee_property_pk PRIMARY KEY (emp_prop_id);
ALTER TABLE employee_property ADD CONSTRAINT emp_prop_fk FOREIGN KEY (emp_id) REFERENCES employee(emp_id);

下面是我的hibernate映射XML:-------------------------------

<hibernate-mapping>
    <class name="com.persistence.vo.Employee" table="EMPLOYEE">
        <composite-id>
            <key-property name="fName" column="FNAME"/>
            <key-property name="lName" column="LNAME"/>
        </composite-id>
        <property name="empId" type="long" access="field" unique="true">
            <column name="EMP_ID" />
        </property>
        <set name="employeeProperties" table="employee_properties" lazy="false"
            fetch="select" cascade="save-update, delete-orphan">
            <key>
                <column name="emp_id" not-null="true"/>
            </key>
            <one-to-many entity-name="com.persistence.vo.EmployeeProperty"/>
        </set>
    </class>
</hibernate-mapping>

-------------员工属性-------------------

<hibernate-mapping>
    <class name="com.persistence.vo.EmployeeProperty" table="EMPLOYEE_PROPERTY">
        <id name="empPropId" type="long">
            <column name="EMP_PROP_ID" />
            <generator class="assigned" />
        </id>
    <many-to-one name="employee" class="com.persistence.vo.Employee" fetch="select">
        <column name="empId" not-null="true"/>
    </many-to-one>
        <property name="propertyName" type="java.lang.String">
            <column name="PROPERTY_NAME" />
        </property>
        <property name="propertyValue" type="java.lang.String">
            <column name="PROPERTY_VALUE" />
        </property>
    </class>
</hibernate-mapping>
public class Employee {

    private long empId;
    private String fName;
    private String lName;

    private Set<EmployeeProperty> employeeProperties;
}
public class EmployeeProperty {

    private long empPropId;
    private Employee employee;
    private String propertyName;
    private String propertyValue;
}

是否可以引用非主键作为外键?

共有1个答案

燕刚捷
2023-03-14

我被你的地图弄糊涂了。Employee到EmployeeProperty是一对多的,但EmployeeProperty中的emp_id在映射中标记为此实体的ID字段(即PK,唯一列)?

您有多种选项:

[1]向EmployeeProperty添加另一个字段以充当ID,例如emp_property_id

 类似资料:
  • 问题内容: 我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。 然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示: 我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体? 任何帮助表示赞赏。 问题答案: 这受JPA 2规范的 第2.4.1节“与派生身

  • 我是hibernate新手,我遇到了以下问题。“唯一索引或主键冲突”。问题的出现是由于错误的映射,但我花了几个小时来找出为什么会发生这种情况。 我有一个超级类叫做数据结构 然后是关联两个元素的类关联。这里省略了类的某些部分,只是为了简化它。 这个类作为两个数据结构类型类之间的中间类。像这样。 TP-协会-TP TP等级: 或者激活类 总的来说,我增加了以下内容: 当我尝试添加相同的对象时,问题就出

  • b)对Employee类中的ReferencedColumnName='department id'使用@ManyToOne和@JoinColumn。 建议采用哪种方法?还是这两种方法用于完全不同的问题?

  • Hi编写Spring应用程序,使用Spring Security。这是我的用户和帐户角色数据库: 我的实体类: 当我尝试登录我的系统我有错误: Hibernate:选择userrolese0_. username作为username3_1_0_,userrolese0_. id作为id1_0_0_,userrolese0_. id作为id1_0_1_,userrolese0_. name作为nam

  • 问题内容: 我正在尝试建立一个PostgreSQL表,该表具有两个指向另一个表中相同主键的外键。 运行脚本时出现错误 sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Company.stakeholder的父/子表之间的联接条件- 有多个链接表的外键路径。指定“ foreign_keys”参数,提供这些列的列表,这些列应被视为包含对父表的外键引用。 那