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

如何在JPA中使用子类中的两个组合键和父类中的一个PK进行OneTONE映射

陈瀚玥
2023-03-14

我有以下错误说明

异常[EclipseLink-7220](EclipsePersistenceServices-2.6.3.v20160428-59c81c5):org。日食坚持不懈例外情况。ValidationException异常描述:实体类[class com.jlr.vista.business.rule.model.rule]中带注释元素[field specificationSubset]上的@JoinColumns不完整。当源实体类使用复合主键时,必须使用@JoinColumns为每个联接列指定@JoinColumn。必须在每个这样的@JoinColumn中指定name和referencedColumnName元素。

我已经找到了许多解决方案关于这个错误但他们都没有解决这种问题在每种情况下两个类都有相同数量的复合键但在我的情况下我有一个PK在实体类和FK在子类但孩子类还有一个PK,这使它们成为复合键。

在这种情况下,应如何实现@OneToOne映射?我使用的是EclipseLink版本2.6

规则JAVA

 public class Rule
    {
        private static final long serialVersionUID = 1L;


        @Id
        @Column(name="RULE_ID")
        @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="RUL_SEQ1")
        @SequenceGenerator(name="_RUL_SEQ1",sequenceName="RUL_SEQ1",allocationSize=1)
        protected Integer ruleId;

        @Column(name="PARENT_RULE_ID")
        protected Integer parentRuleId;

        @Column(name="RULE_TYPE_CODE")
        protected String ruleTypeCode;

        @Column(name="BRAND")
        protected String brand;

        @Column(name="RULE_DESCRIPTION")
        protected String ruleDesscription;

        @Column(name="RULE_REFERENCE")
        protected String ruleReference;

        @Column(name="CONSTRAINT_TYPE")
        protected String constraintType;

        @Column(name="ARCHIVE_STATUS")
        protected String archiveStatus;

        @ManyToMany(targetEntity=VistaRulePartner.class, fetch=FetchType.LAZY)
        @JoinColumns({
            @JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID")
        })
        protected List<VistaRulePartner> partners;

        @OneToMany(targetEntity=OrderTypeSubset.class,fetch=FetchType.LAZY,cascade=CascadeType.ALL)
        @JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID",insertable=false,updatable=false)
        protected List orderTypeSubsets;
                    @OneToOne(targetEntity=SpecificationSubset.class,cascade=CascadeType.ALL,fetch=FetchType.LAZY,optional=false)
        @JoinColumn(name="RULE_ID",referencedColumnName="RULE_ID",insertable=false,updatable=false, nullable=false)
private SpecificationSubset specificationSubset;
}

规格子集。JAVA

@IdClass(SpecificationSubsetPK.class)
@Entity
@Table(name="RULE_SPECIFICATION")
@InstantiationCopyPolicy
@Cache( refreshOnlyIfNewer=true,
        coordinationType = CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES)
public class SpecificationSubset extends ModelArchivable
{
    @Id
    @Column(name="RULE_ID")
    private Integer ruleId;

    @Id
    @Column(name="RULE_SPEC_ID")
    private Integer ruleSpecId = 1;

    @Column(name="SPEC_MARKET")
    private String specMarket;

    @Column(name="DESC_GROUP_ID")
    private String descGroupId;

    @OneToMany(targetEntity=FeatureSubset.class, fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID", insertable=false, updatable=false),
        @JoinColumn(name="RULE_SPEC_ID", referencedColumnName="RULE_SPEC_ID", insertable=false, updatable=false)
    })
    private List featureSubsets;

    @OneToOne(targetEntity=Rule.class, fetch=FetchType.LAZY)
    @JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID")
    private Rule ruleHolder;
}

特点ubset.java

@Entity
@Table(name="RULE_FEATURE")
@NamedQuery(
        name="GetFeatureCodesForVehicleConfig",
        query="SELECT f FROM FeatureSubset f WHERE f.ruleId = :ruleId AND f.featureType = 'YEAR'")
@InstantiationCopyPolicy
@Cache( coordinationType = CacheCoordinationType.SEND_NEW_OBJECTS_WITH_CHANGES)
public class FeatureSubset
{
    @Id
    @Column(name="FEATURE_TYPE_NO")
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="VISTA_RUF_SEQ1")
    @SequenceGenerator(name="RUF_SEQ1",sequenceName="RUF_SEQ1",allocationSize=1)
    private Integer featureTypeNo; //Sequence no for the vista_rule_feature table

    @Column(name="RULE_SPEC_ID")
    private Integer ruleSpecId = 1;

    @Column(name="RULE_ID")
    private Integer ruleId;

    @Column(name="FEATURE_TYPE_ID")
    private String featureType;

    @Column(name="FEATURE_CODE")
    private String featureCode;

    @OneToOne(targetEntity=SpecificationSubset.class, fetch=FetchType.LAZY)
    /*@JoinColumns({
        @JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID"),
        @JoinColumn(name="RULE_SPEC_ID", referencedColumnName="RULE_SPEC_ID")
    })*/
    private SpecificationSubset specificationSubset;
}

共有1个答案

明阳旭
2023-03-14

您不需要在关系的两侧定义映射信息——一个就足够了,通常是关联的所有者。

因此,由于您的规范子集包含到规则的映射信息,因此在规则中,您可以引用此关系:

@OneToOne(targetEntity=SpecificationSubset.class,
          cascade=CascadeType.ALL,
          fetch=FetchType.LAZY,
          optional=false,
          mappedBy="ruleHolder")  // name of the property in an owning class
private SpecificationSubset specificationSubset;

似乎你也需要修复拥有方,因为你已经有了一个@列与RULE_ID名称:

@OneToOne(targetEntity=Rule.class, fetch=FetchType.LAZY)
@JoinColumn(name="RULE_ID", referencedColumnName="RULE_ID", insertable=false, updatable=false)
private Rule ruleHolder;
 类似资料:
  • 我正在使用: Spring3.2 Hibernate4.1.9 我需要用JPA映射三个类。A类和B类有很多种关系。A类和B类的唯一组合需要拥有C类的集合。 表A B表 表C 联接表--上的唯一键(fooId、barId) 改变现有的数据结构不是一种选择。 编辑1: 目标:加载一个Foo,获取它的条集合。从每个酒吧,得到它的(他们的!)收集数据。 甲级 B类 C类

  • 我有两个从抽象类继承的类,它们有父子关系。 所以我使用了注释OneToOne和ManyToOne,但是子类中的父实体总是为空。有人能帮我吗,我花了几个小时谷歌和测试了许多conf,但没有成功。 这些是我的类中的代码: ... ... ... 如果我不添加@JoinCol列注释,JPA会创建一个关联表,但无法检索父级,而关联可以直接通过在数据库中请求来完成。 非常感谢你的帮助。 祝好

  • 我正在学习Hinbernate,所以如果我能将两个类映射到一个DB表,我的想法就被忽略了。 Ex: 虽然这两个类都映射到一个表,但让我们用字符串数据类型的一列来命名Employee。 Hibernate是否能够根据我用于创建的类在表中创建行。还是您认为应该有一个鉴别器列来区分类? 注意:类之间没有继承关系,它们是独立的。

  • 问题内容: 在此代码中,如何为组合键生成Java类(如何在休眠状态下组合键): 问题答案: 要映射组合键,你可以使用 或在注解。我知道这个问题不仅仅涉及,但规范定义的规则也适用。因此,它们是: 2.1.4主键和实体身份 … 组合主键必须对应于单个持久性字段或属性,或者对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据库密钥由几列组成时,从传统数据库进行映射时,通常会出

  • 我正在尝试使用JPA注释设计我的实体类。 我正在努力做的是: 具有 ID、***电子邮件、密码、activation_key、active、role***的用户表 和许多类型的用户表。 student_table user_id第一名最后一名公司地址等 MENTOR user_id第一名最后一名DOB部门等 当用户注册时,根据他们的角色,他们将被分为两个表(用户、导师/学生) 当它们登录时,Man

  • 让我们假设我有一辆只有颜色和价格属性的普通车。价格取决于汽车的颜色。 由于汽车物体只会在颜色和相应的价格上有所不同,我应该只创建两个类,还是创建一个超类和两个子类更好,每个超类和两个子类都有自己的计算价格的方法?