2014-04-04 106 views
0

我有3類,分別是:JPA - 分配不同的獨特約束兩個子類SINGLE_TABLE層次抽象類

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public abstract class Tag { 
    @Id 
    private String id; 
    private String name; 
} 

@Entity 
@Table(uniqueConstraints= 
     @UniqueConstraint(columnNames={"name"})) 
public class SystemTag extends Tag { 

} 

@Entity 
@Table(uniqueConstraints= 
     @UniqueConstraint(columnNames = {"name", "user"})) 
public class CustomTag extends Tag{ 
    @ManyToOne 
    private User user; 
} 

,所以我想爲系統標籤使用唯一的名稱,唯一的名稱,用戶對來自定義標籤(多用戶可以創建相同的標籤),但我得到兩個警告如下:

<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.CustomTag 
<timestamp> WARN AnnotationBinder:601 - HHH000139: Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: <domain>.SystemTag 

而且它可以讓我創建兩個名稱相同的系統代碼,並使用了相同的用戶兩個同名的自定義標籤。

我該如何處理?

回答

1

如果您正在使用一個顯然不起作用的表。

切換到使用JOINED策略

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Tag { 
    @Id 
    private String id; 
    private String name; 
} 

,然後你將有CustomTag爲SystemTag一個表,表具有唯一約束的預期。

+0

在項目設計小組負責人決定使用它作爲單個表,但我想我應該把它作爲每個類的連接或表使用。無論如何感謝:) – bdogru

+0

以及你可能能夠使用鑑別器1表。取決於您獨特的關鍵要求。如果你在名稱/用戶上創建了密鑰,並忘記了可能依賴於你的數據庫的獨特名稱。例如對於記錄1/alan/null,2/alan/abc,3/alan/xyz應該沒問題:http://stackoverflow.com/a/767702/1356423 –