JPA:在一个表中的主键列和另一个表中的非主键列之间创建约束?

JPA:在一个表中的主键列和另一个表中的非主键列之间创建约束?,jpa,Jpa,我正在使用JPA并试图找出如何在一个表中的主键列和另一个表中的非主键列之间创建唯一约束。我有两张桌子: Customer ( id character varying(32) NOT NULL, customer_name character varying(50) ) 及 客户和帐户之间存在单向的一对多关系,并且有一个约束,即Account.Account_名称对于每个客户都是唯一的。代码如下所示: @Entity public class Customer { @I

我正在使用JPA并试图找出如何在一个表中的主键列和另一个表中的非主键列之间创建唯一约束。我有两张桌子:

Customer (
    id character varying(32) NOT NULL,
    customer_name character varying(50)
)

客户和帐户之间存在单向的一对多关系,并且有一个约束,即Account.Account_名称对于每个客户都是唯一的。代码如下所示:

@Entity
public class Customer {
    @Id
    @Column(length=32)
    private String id;

    @Column(unique=true, length=50)
    private String customer_name;

    @OneToMany
    private List<Account> accounts;
    ...
}
默认情况下,将创建联接表:

CUSTOMER_ACCOUNTS (
    customer_id character varying(32),
    accounts_id character varying(32)
)

如何创建唯一约束以确保Account.Account\u名称对于每个客户都是唯一的?

向Customer类添加JoinColumn注释::

@Entity
public class Customer {
    @Id
    @Column(length=32)
    private String id;

    @Column(unique=true, length=50)
    private String customer_name;

    @OneToMany(mappedBy="customer")
    @JoinColumn(name="CUSTOMER_ID", referencedColumnName="ID")
    private List<Account> accounts;
    ...
}

修改模式是一种选择吗?如果你去掉了连接表,唯一的限制是微不足道的。你会推荐什么样的模式更改,以及如何在JPA中表达它们?Szilágyi没有明确指出。这能以单向的方式完成吗?如果可能的话,我们的项目一直在努力坚持这一点。(不是我的主意。)顺便说一句,我们正在使用JPA生成DDL。谢谢。我得到了一个与“mappedBy”相关的异常:“Customer.accounts声明它由“Customer”映射,但这不是相关类型的字段。”mappedBy中的“Customer”指的是什么?我看到JavaDoc说“mappedBy”是“拥有关系的字段是必需的,除非关系是单向的。我刚刚删除了mappedBy元素,现在一切正常。谢谢相关问题:既然customer_id只是一个外键,我正在使用JPA生成模式,那么JPA中有没有办法使其显式化?例如,如果有人查看Account表结构,会很高兴看到这样的内容:外键(customer_id)引用customer(id)您使用什么JPA实现?我们使用的是OpenJPA 2.2
CUSTOMER_ACCOUNTS (
    customer_id character varying(32),
    accounts_id character varying(32)
)
@Entity
public class Customer {
    @Id
    @Column(length=32)
    private String id;

    @Column(unique=true, length=50)
    private String customer_name;

    @OneToMany(mappedBy="customer")
    @JoinColumn(name="CUSTOMER_ID", referencedColumnName="ID")
    private List<Account> accounts;
    ...
}
@Entity
@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames={"CUSTOMER_ID", "ACCOUNT_NAME"})
)
public class Account {
    @Id
    @Column(length=32)
    private String id;

    @Column(length=50)
    private String account_name;

    @Column(name="CUSTOMER_ID")
    private String customer_id;
    ...
}