播放 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 或用户名

为啥递归联合不适用于 PostgreSQL 中的复合类型

Fetch Lazy 不适用于具有复合 PK 的 ManyToOne

QSS 不适用于 QVBoxLayout 中(复合小部件)中的第一个 QSizeGrip

Spring Batch分区不适用于复合项目处理器

YouTube iframe 播放器的自动播放不适用于 chrome 和 firefox