播放 1.2.4 findByID 不适用于复合 ID
Posted
技术标签:
【中文标题】播放 1.2.4 findByID 不适用于复合 ID【英文标题】:Play 1.2.4 findByID not working for composite Id 【发布时间】:2013-06-11 06:28:24 【问题描述】:我的数据库表中有一个复合主键。 findByID 方法接受 id 并返回实体。我不确定如何实现此方法来接受复合 Id 并返回相应的实体。
复合ID是使用@EmbeddedID注解实现的。
请告诉我。
【问题讨论】:
【参考方案1】:如果您使用的是嵌入式 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"))
)
这种方式更容易获取对应的实体。
【讨论】:
【参考方案2】:关键是为您的复合 ID 确定一个字符串表示形式。
https://***.com/a/19278569/1369495 有一个示例可能会为您指明正确的方向。
【讨论】:
以上是关于播放 1.2.4 findByID 不适用于复合 ID的主要内容,如果未能解决你的问题,请参考以下文章
FindById 和 FindOne 不适用于我从 Angular 本地存储获得的 ID 或用户名
Fetch Lazy 不适用于具有复合 PK 的 ManyToOne