多joinColumn Jpa
Multi joinColumn Jpa
大家好,感谢您的关注!
正如标题所说,我在尝试连接 jpa 中的 3 个实体时遇到问题,其中两个实体与 3 个键(一个 Pk 和两个 Fk)连接。我在 github 上创建了一个完美运行的简单项目,但我需要稍微改变一下这种情况。
这是源代码的link:
我现在需要的是更新Parent和Child之间的关系,我需要用3列连接它们,parentID(pid) + GranParentId ( gid) + fk2 ,它应该是这样的:
//PARENT
@Entity
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer pid;
@ManyToOne
@JoinColumn(name = "gid", referencedColumnName = "gid")
private GrandParent grandparent;
@Column(name = "fk2")
private String fk2;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
private Set<Child> childs;
//getters and setters
}
//CHILD
@Entity
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
@ManyToOne
@JoinColumn(name = "pid", referencedColumnName = "pid")
@JoinColumn(name = "gid", referencedColumnName = "gid")
@JoinColumn(name = "fk2", referencedColumnName = "fk2")
private Parent parent;
//GETTERS AND SETTERS
}
这给我一个错误,因为我想我也在尝试分享 pk。
我能够在源代码中复制一个类似的场景,其中我只将 gid 和 fk2 连接到 Child,我可能认为我需要一个可嵌入的 class 来存储我的 id 和其他密钥。
谢谢大家!
尝试使用IdClass
,所以;父 class 应该有多个主键,称为复合键,通过将它引用到子 class,JPA 现在将知道应该在子中注入多个连接列class.
示例:
// Id Class
public class ParentId implements Serializable{
@Id
private Integer key1;
@Id
private Integer key2;
}
// Parent
@Entity
@IdClass(ParentId.class)
public class Parent implements Serializable {
@Id
private Integer key1;
@Id
private Integer key2;
}
// Child
@Entity
public class Child implements Serializable {
@Id
private Integer childId;
@ManyToOne
@JoinColumn(name = "key1", referencedColumnName = "key1")
@JoinColumn(name = "key2", referencedColumnName = "key2")
private Parent parent;
}
我不确定这是否对您有帮助,但您可以阅读 this article 了解更多详情。
大家好,感谢您的关注! 正如标题所说,我在尝试连接 jpa 中的 3 个实体时遇到问题,其中两个实体与 3 个键(一个 Pk 和两个 Fk)连接。我在 github 上创建了一个完美运行的简单项目,但我需要稍微改变一下这种情况。 这是源代码的link:
我现在需要的是更新Parent和Child之间的关系,我需要用3列连接它们,parentID(pid) + GranParentId ( gid) + fk2 ,它应该是这样的:
//PARENT
@Entity
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer pid;
@ManyToOne
@JoinColumn(name = "gid", referencedColumnName = "gid")
private GrandParent grandparent;
@Column(name = "fk2")
private String fk2;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
private Set<Child> childs;
//getters and setters
}
//CHILD
@Entity
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
@ManyToOne
@JoinColumn(name = "pid", referencedColumnName = "pid")
@JoinColumn(name = "gid", referencedColumnName = "gid")
@JoinColumn(name = "fk2", referencedColumnName = "fk2")
private Parent parent;
//GETTERS AND SETTERS
}
这给我一个错误,因为我想我也在尝试分享 pk。 我能够在源代码中复制一个类似的场景,其中我只将 gid 和 fk2 连接到 Child,我可能认为我需要一个可嵌入的 class 来存储我的 id 和其他密钥。
谢谢大家!
尝试使用IdClass
,所以;父 class 应该有多个主键,称为复合键,通过将它引用到子 class,JPA 现在将知道应该在子中注入多个连接列class.
示例:
// Id Class
public class ParentId implements Serializable{
@Id
private Integer key1;
@Id
private Integer key2;
}
// Parent
@Entity
@IdClass(ParentId.class)
public class Parent implements Serializable {
@Id
private Integer key1;
@Id
private Integer key2;
}
// Child
@Entity
public class Child implements Serializable {
@Id
private Integer childId;
@ManyToOne
@JoinColumn(name = "key1", referencedColumnName = "key1")
@JoinColumn(name = "key2", referencedColumnName = "key2")
private Parent parent;
}
我不确定这是否对您有帮助,但您可以阅读 this article 了解更多详情。