2013-12-18 39 views
1

我使用JPA,並試圖找出如何在一個表中,而在另一個非主鍵列創建一個主鍵列之間的唯一約束。我有兩個表:JPA:在一個表中的主鍵列和另一個表中的非主列之間創建約束?

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

Account (
    id character varying(32) NOT NULL, 
    account_name character varying(50) 
) 

有一個單向的,一到許多與約束Account.account_name是每個客戶獨特的客戶和客戶之間的關係。代碼看起來像這樣:

@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; 
    ... 
} 

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

    @Column(length=50) 
    private String account_name; 
    ... 
} 

連接表默認創建:

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

如何創建唯一約束,以確保Account.account_name是每個客戶獨特?

+1

正在修改模式的選項?如果你擺脫了連接表,唯一的限制是微不足道的。 – mabi

+0

您會推薦哪些模式更改,以及如何在JPA中表達它們? – gxwilso

+0

SzilágyiDonát釘牢它。 – mabi

回答

1

添加JoinColumn註解Customer類::

@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; 
    ... 
} 

引用的列名指向Customer表的主鍵,而名稱指向Account表的外鍵字段。 此外,還應CUSTOMER_ID字段和複合唯一約束添加到該帳戶實體:

@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; 
    ... 
} 
+0

這可以以單向方式完成嗎?如果可能,我們的項目一直試圖堅持。 (不是我的想法。) 順便說一句,我們使用JPA來生成DDL。 – gxwilso

+0

我修改了答案,使聯接單向。 –

+0

謝謝。我得到一個與「mappedBy」相關的異常:「Customer.accounts聲明它是由」customer「映射的,但這不是相關類型的字段。」 mappedBy中的「客戶」是指什麼? 我看到Javadoc說「的mappedBy」是「擁有的關係,是必需的,除非關係是單向的領域 – gxwilso

相關問題