我的数据库表中有一个复合主键。方法findByID接受id并返回实体。我不确定如何实现此方法来接受复合ID并返回相应的实体。
使用@EmbeddedID注释实现复合ID。
请告诉我这件事。
答案 0 :(得分:0)
如果您使用嵌入式ID,则必须覆盖对象的equals和hashCode方法 例: 模特课:
public class ModelClass extends GenericModel {
@EmbeddedId
public EmbeddedPK embeddedPK = new EmbeddedPK ();
.
.
.
}
嵌入式主键类:
@Embeddable
public class EmbeddedPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name="col1_id",nullable=false,updatable=false)
public Col1 col1;
@ManyToOne
@JoinColumn(name="col2_id",nullable=false, updatable=false)
public Col2 col2;
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof EmbeddedPK)) {
return false;
}
EmbeddedPK castOther = (EmbeddedPK)other;
return
(this.col1 == castOther.col1)
&& (this.col2 == castOther.col2);
}
public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + ((int) (this.col1 ^ (this.col1 >>> 32)));
hash = hash * prime + ((int) (this.col2 ^ (this.col2 >>> 32)));
return hash;
}
}
通过上述方法,您可以创建嵌入式ID并获取相应的实体。
但另一种最佳方法是使用GenericModels GenerationType.AUTO。 例如:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "entity_id")
public Long id;
并通过在实体类上方添加以下代码来使您的列集唯一:
@Table(name="example", uniqueConstraints=@UniqueConstraint(columnNames={"col_1", "col_2"}))
})
这种方法更容易获取相应的实体。
答案 1 :(得分:0)
关键是决定复合id的字符串表示。
https://stackoverflow.com/a/19278569/1369495有一个例子可能会指出你正确的方向。