【问题标题】:Compound keys in JPAJPA 中的复合键
【发布时间】:2008-09-18 08:16:07
【问题描述】:

我想创建一个实体,它有一个自动生成的主键,还有一个由其他两个字段组成的唯一复合键。我如何在 JPA 中执行此操作?
我想这样做是因为主键应该用作另一个表中的外键,并且使其复合并不好。

在下面的sn-p中,我需要命令和模型是唯一的。 pk 当然是主键。

@Entity
@Table(name = "dm_action_plan")
public class ActionPlan {
    @Id
    private int pk;
    @Column(name = "command", nullable = false)
    private String command;
    @Column(name = "model", nullable = false)
    String model;
}

【问题讨论】:

  • 使用复合键作为外键有什么问题?

标签: java jpa annotations compound-key


【解决方案1】:

你可以使用@UniqueConstraint 类似这样的东西:

@Entity
@Table(name = "dm_action_plan",
       uniqueConstraints={ @UniqueConstraint(columnNames= "command","model") } )
public class ActionPlan {
    @Id
    private int pk;

    @Column(name = "command", nullable = false)
    private String command;

    @Column(name = "model", nullable = false)
    String model;
}

这将允许您的 JPA 实现为唯一约束生成 DDL。

【讨论】:

  • 正确的形式是这样的:@Table(name = "dm_action_plan") @UniqueConstraint(columnNames = {"command", "model"})
  • homaxto:根据 EJB3.0 规范,Michel 给出了正确的形式。
【解决方案2】:

使用@GeneratedValue 表示将生成密钥,使用@UniqueConstraint 表示唯一性

@Entity
@Table(name = "dm_action_plan"
       uniqueConstraint = @UniqueConstraint({"command", "model"})
)
public class ActionPlan {
    @Id
    @GeneratedValue
    private int pk;
    @Column(name = "command", nullable = false)
    private String command;
    @Column(name = "model", nullable = false)
    String model;
}

【讨论】:

  • 它不会创建复合约束。它将创建两个约束,每个约束对应于您在 @UniqueConstraint 中注释的每个列名。
  • 那么你的 JPA 实现是错误的。 JPA2 规范,§11.1.49 columnNames 是“组成约束的列名数组”(约束,而不是约束)。
猜你喜欢
  • 2013-06-07
  • 2011-11-26
  • 2021-05-25
  • 2011-09-21
  • 2014-09-04
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多