在另一个实体中被引用的组合键的一个Id [英] One Id of composite key to be referenced in another entity

查看:87
本文介绍了在另一个实体中被引用的组合键的一个Id的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  • 表1只有两列构成一个组合键

  • 表2 id列正在生成。

  • Table1的一个属性的值我正在提供,对于第二个属性,我需要它来提取Table2的生成值。
    这里是我到目前为止 -



  • 复合主键:

      public class PKClass implements Serializable 
    {
    private static final long serialVersionUID = -2092390836751020965L;
    public PKClass(){}
    public PKClass(long actId,long actAttId){
    this.actvId = actId;
    this.actvAtId = actAttId;
    }

    private long actvId;
    private private actvAtId;
    // getters,setters,equals,hashcode
    }

    实体类1 :

    pre $ @ $ $ c $ @Entity @Table(name =Table1)
    @IdClass(PKClass.class)
    public class AtLinkData实现Serializable
    {
    @Id @Column(name =ACT_ID,nullable = false)
    private private actvId;
    @Id @Column(name =ACT_AT_ID)
    private private actvAtId;
    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedby =atLinkData)
    @JoinColumn(name =ACT_AT_ID)
    私人AtData atData;
    // getters,setters
    }

    实体类2:

      @Entity @Table(name =Table2)
    公共类AtData实现Serializable
    {
    @TableGenerator(name =somename,table =sometable,pkColumnName =somecolumn,valueColumnName =valuename,pkColumnValue =Table2,allocationSize = 1)
    @Id @GeneratedValue(strategy = GenerationType。 TABLE,generator =somename)
    @Column(name =ACT_AT_ID)
    private Long id;
    //其他变量
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name =ACT_AT_ID)
    私人AtLinkData atLinkData;
    // getters setters
    }

    我一直在尝试不同的事情,但使用上面的代码,我得到错误:

     引起:org.hibernate.MappingException:用于atLinkData的断列映射.id of:com.test.database.AtData 


    解决方案

    这是我如何解决它:



    AtLinkData.java

      @ Id 
    @GeneratedValue(generator =foreignGenerator)
    @ org.hibernate.annotations.GenericGenerator(name =foreignGenerator,strategy =foreign,parameters = @Parameter(name =property,值)=atData))
    @Column(name =ACT_AT_ID)
    私人长期actvAtId;

    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name =ACT_AT_ID,insertable = false,updatable = false)
    private AtData atData;
    // getters,setters

    AtData.java

      @OneToOne(fetch = FetchType.LAZY,mappedBy =atData)
    私人AtLinkData atLinkData;

    感谢 @CycDemo 寻求帮助。


    • Table 1 has only two columns which form a composite key.
    • Table 2 id column is being generated.
    • Value for one property of Table1 I am supplying and for second property I need it to pick up the generated value of Table2. Here is what I have so far-

    Composite primary key:

    public class PKClass implements Serializable
    {
        private static final long serialVersionUID = -2092390836751020965L;
        public PKClass(){}
        public PKClass(long actId, long actAttId){
            this.actvId = actId;
            this.actvAtId = actAttId;
        }
    
        private long actvId;
        private long actvAtId;
        // getters, setters, equals, hashcode
    }
    

    Entity class 1:

    @Entity @Table(name = "Table1")
    @IdClass(PKClass.class)
    public class AtLinkData implements Serializable
    {
        @Id @Column(name = "ACT_ID", nullable = false)
        private long actvId;
        @Id @Column(name = "ACT_AT_ID")
        private long actvAtId;
        @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, , mappedBy = "atLinkData")
        @JoinColumn(name = "ACT_AT_ID")
        private AtData atData;
        // getters, setters
    }
    

    Entity class 2:

    @Entity @Table(name = "Table2")
    public class AtData implements Serializable
    {
        @TableGenerator(name = "somename", table = "sometable", pkColumnName = "somecolumn", valueColumnName = "valuename", pkColumnValue = "Table2", allocationSize = 1)
        @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "somename")
        @Column(name = "ACT_AT_ID")
        private Long id;
        // other variables
        @OneToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "ACT_AT_ID")
        private AtLinkData atLinkData;
        // getters setters
    }
    

    I have been trying different things, but with the code above, I am getting the error:

    Caused by: org.hibernate.MappingException: broken column mapping for: atLinkData.id of: com.test.database.AtData
    

    解决方案

    Here is how I solved it:

    AtLinkData.java

    @Id
    @GeneratedValue(generator = "foreignGenerator")
    @org.hibernate.annotations.GenericGenerator(name = "foreignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "atData"))
    @Column(name = "ACT_AT_ID")
    private long actvAtId;
    
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ACT_AT_ID",insertable=false,updatable=false)
    private AtData atData;
    // getters, setters
    

    AtData.java

    @OneToOne(fetch = FetchType.LAZY, mappedBy="atData")
    private AtLinkData atLinkData;
    

    Thanks @CycDemo for your help.

    这篇关于在另一个实体中被引用的组合键的一个Id的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆