【问题标题】:One Id of composite key to be referenced in another entity要在另一个实体中引用的复合键的一个 Id
【发布时间】:2014-01-21 07:45:21
【问题描述】:
  • 表 1 只有两列构成复合键。
  • 正在生成表 2 id 列。
  • 我提供的表 1 的一个属性的值和第二个属性的值我需要它来获取表 2 的生成值。 这是我到目前为止所拥有的-

复合主键:

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
}

实体类 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
}

实体类 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
}

我一直在尝试不同的东西,但是使用上面的代码,我得到了错误:

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

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    @OneToOne(mappedBy="otherInfo") 使用JoinColumns 注释而不是JoinColumn

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "ACTVID", referencedColumnName = "ACTVID"),
        @JoinColumn(name = "ACTVATID", referencedColumnName = "ACTVATID")
    })
    private AtLinkData atLinkData;  
    

    AtData实体的DB表你必须添加两个外键列ACTVIDACTVATID

    更新

    如果您无法在Table 2 中添加新列,请在AtData 实体中使用mappedBy 属性,而不是AtLinkData。尝试如下。

    AtLinkData.java

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ACT_AT_ID")
    private AtData atData;
    

    AtData.java

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

    【讨论】:

    • 我无法在表 2 中添加另一列,它是现有表。
    • 按照建议更改了代码,现在代码失败了,因为 PKClass 中的 actvAtId 为空,因此 hashcode() 失败了。我应该在 AtLinkData 中实例化 PKClass 吗?据我所知,我猜不是。 :/ 现在,如果我单独尝试,实体 AtData 将被成功持久化。
    【解决方案2】:

    我是这样解决的:

    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;
    

    感谢@CycDemo 的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 2021-05-25
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2022-07-20
      相关资源
      最近更新 更多