播放1.2.4 findByID不适用于复合ID

时间:2013-06-11 06:28:25

标签: java playframework crud playframework-1.x

我的数据库表中有一个复合主键。方法findByID接受id并返回实体。我不确定如何实现此方法来接受复合ID并返回相应的实体。

使用@EmbeddedID注释实现复合ID。

请告诉我这件事。

2 个答案:

答案 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有一个例子可能会指出你正确的方向。