gpt4 book ai didi

java - 使用多个外键作为复合主键的一对多实体映射

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:34 25 4
gpt4 key购买 nike

我浏览了 java 持久性文档和许多 Stackoverflow 示例来了解这种表示形式。有人可以验证我这样做是否正确吗?

类型 A 的实例与类型 C 的许多实例关联。类型 B 的实例与类型 C 的许多实例关联。C 的实例具有由指向实体 a 和 B 的外键组成的复合主键。

表格:

一个

|------|
| A_ID |
|------|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
|------|

其中 A_ID 是主键

B

|------|
| B_ID |
|------|
| 1 |
| 2 |
|------|

其中B_ID是主键

C

|------|------|
| A_ID | B_ID |
|------|------|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
|------|------|

其中外键组合(A_ID,B_ID)为主键

实体:

@Entity
Class A {

@Id
@PrimaryKeyColumnName(name="A_ID")
private Long id;


@OneToMany(
cascade = CascadeType.ALL,
orphanRemoval = true,
mappedBy="A_ID"
)
Collection<C> values;


public Long getId() {
return this.id;
}


public Collection<C> getValues() {
return this.values;
}
}


@Entity
Class B {

@Id
@PrimaryKeyColumnName(name="B_ID")
private Long id;

public Long getId() {
return this.id;
}
}


@Entity
Class C {

@EmbeddedId
private CId cId;

public CId getCId() {
return this.cId;
}
}

@Embeddable
Class CId {

@ManyToOne
@JoinColumn(name="A_ID")
private A a;


@ManyToOne
@JoinColumn(name="B_ID")
private B b;


public Long getA() {
return this.a;
}

public Long getBId() {
return this.b;
}

@Override
public int hashCode() {
return Objects.hash(
this.getA().getId(),
this.getBId().getId()
);
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof CId)) return false;
CId that = (CId) obj;
return Objects.equals(this.getA().getId(),
that.getA().getId()) &&
Objects.equals(this.getBId().getId(),
that.getBId().getId());
}
}

最佳答案

这就是 JPA 规范所说的“派生身份”。您应该稍微不同地定义您的类。以下是代码的重要部分:

@Entity
Class A {

@Id
@Column(name="A_ID")
private Long id;

@OneToMany(
cascade = CascadeType.ALL,
orphanRemoval = true,
mappedBy="a"
)
Collection<C> values;

...
}


@Entity
Class B {

@Id
@Column(name="B_ID")
private Long id;

...
}


@Entity
Class C {

@EmbeddedId
private CId cId;

@ManyToOne
@JoinColumn(name="A_ID")
@MapsId("aId") // maps aId attribute of embedded id
private A a;

@ManyToOne
@JoinColumn(name="B_ID")
@MapsId("bId") // maps bId attribute of embedded id
private B b;

...
}

@Embeddable
Class CId {

private Long aId; // corresponds to PK type of A

private Long bId; // corresponds to PK type of B

...
}

派生身份在 JPA 2.1 规范的第 2.4.1 节中讨论。

关于java - 使用多个外键作为复合主键的一对多实体映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49741572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com