Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要在另一个实体中引用的复合键的一个Id 表1只有两列组成复合键 正在生成表2 id列 我提供的表1的一个属性的值,以及第二个属性的值,我需要它来获取表2的生成值。 这是我到目前为止所拥有的-_Java_Hibernate_Jpa - Fatal编程技术网

Java 要在另一个实体中引用的复合键的一个Id 表1只有两列组成复合键 正在生成表2 id列 我提供的表1的一个属性的值,以及第二个属性的值,我需要它来获取表2的生成值。 这是我到目前为止所拥有的-

Java 要在另一个实体中引用的复合键的一个Id 表1只有两列组成复合键 正在生成表2 id列 我提供的表1的一个属性的值,以及第二个属性的值,我需要它来获取表2的生成值。 这是我到目前为止所拥有的-,java,hibernate,jpa,Java,Hibernate,Jpa,复合主键: public class PKClass implements Serializable { private static final long serialVersionUID = -2092390836751020965L; public PKClass(){} public PKClass(long actId, long actAttId){ this.actvId = actId; this.actvAtId = ac

复合主键:

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
@OneTONE(mappedBy=“otherInfo”) 使用
JoinColumns
注释而不是
JoinColumns

@OneToOne(fetch = FetchType.LAZY)
@JoinColumns({
    @JoinColumn(name = "ACTVID", referencedColumnName = "ACTVID"),
    @JoinColumn(name = "ACTVATID", referencedColumnName = "ACTVATID")
})
private AtLinkData atLinkData;  
数据库表的
AtData
实体您必须添加两个外键列
ACTVID
ACTVATID

更新

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

AtLinkData.java

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ACT_AT_ID")
private AtData atData;
@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;
@OneToOne(fetch = FetchType.LAZY, mappedBy="atData")
private AtLinkData atLinkData;

我是这样解决的:

AtLinkData.java

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "ACT_AT_ID")
private AtData atData;
@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;
@OneToOne(fetch = FetchType.LAZY, mappedBy="atData")
private AtLinkData atLinkData;

感谢您的帮助。

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