微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多连接列 Jpa

如何解决多连接列 Jpa

大家好,感谢您的关注!。 就像标题说我在尝试连接 jpa 中的 3 个实体时遇到问题,其中两个实体与 3 个键(一个 Pk 和两个 Fks)连接。我在 github 上创建了一个完美的简单项目,但我需要稍微改变一下这种情况。 这是源代码链接

https://github.com/mcau92/java-exercises-projects/tree/master/com.cauduro.example.jpa/com.cauduro.example.mutlijoin

我现在需要的是更新父子之间的关系,我需要将两者连接到 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,我可能认为我需要一个可嵌入的类来存储我的 id 和其他键。

谢谢大家!

解决方法

尝试使用 IdClass,so;父类应该有多个主键,称为复合键,通过引用子类,JPA现在知道子类中应该注入多个连接列。

示例:

// 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了解更多详情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。