我们可以创建一个不匹配数据库约束的JPA映射吗?

时间:2016-02-02 12:00:40

标签: java mysql spring jpa spring-data

假设我有以下域模型:

users
----
id (PK)
partitionkey (PK)

在上表中,分区键主要用于分区。 (MySQL要求partitionkey成为主键的一部分)。如果我们假设记录只能由id字段唯一标识,那么在映射中跳过partitionkey是否有任何危害。例如,下面的映射是否有效:

@Entity
@Table(name = "users")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id")
    public Long id;

    @Column(name="partitionkey")
    private Long partitionKey;

}

2 个答案:

答案 0 :(得分:0)

尝试使用PK字段定义单独的@Embeddable对象,并在@EmbeddedId类中将其用作@Entity,如下所示:

  @Embeddable
  public class MyCompositePK { 

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

  @Column(name="partitionkey")
  private Long partitionKey;
   }

   @Entity
   @Table(name = "users")
   public class User implements Serializable {

    @EmbeddedId
    private MyCompositePK id;
    ...

  }

答案 1 :(得分:0)

是的,它有效。 JPA提供程序不知道实体映射到的表中存在任何约束或其他功能。

然而,这是一个好方法,特别是因为我们在这里谈论分区?请记住,实体通过ID关联。因此,对于与User关联的每个实体,JPA提供程序将仅按id列搜索关联的User实例,因此分区列将不会包含在查询中。这可能是也可能不是问题。有关详细信息,请参阅this answer

替代方案可能是在Hibernate中使用提供程序特定的扩展,例如@JoinFormula,但它们可能不容易正确。

我想说使用复合ID是最直接的解决方案。