2017-07-09 55 views
0

比方說,我們有2個實體(用戶和配置文件):如何正確列映射使用枚舉

User { 
    ID INT NOT NULL, 
    STATUS CHAR(5) NOT NULL 
} 
Profile { 
    ID INT NOT NULL, 
    STATUS CHAR(5) NOT NULL 
} 

我會映射我的實體,如:

public class User { 
    @Id private Integer id; 
    private Status status; 
} 
public class Profile { 
    @Id private Integer id; 
    private Status status; 
} 
public enum Status { 
    ACTIVE, INACTIVE, BLOCKED, SUSPENDED, PENDING; 
} 
@Converter(autoApply = true) 
public class StatusConverter implements AttributeConverter<Status,String> { 
    // Converter methods omitted for brevity 
} 

由於它的作品,我相信一切都很好,直到現在。 某些狀態在許多實體中是等效的,如ACTIVE,但有些狀態不等於另一個實體狀態。例如,用戶可以擁有狀態BLOCKED,但我們從來沒有阻止的配置文件(但我們有一個不活躍的配置文件)。

現在我有一些問題,我想您的幫助:

  1. 我應該爲每個實體創建一個枚舉(如UserStatus和ProfileStatus),所以每一個有它自己的一套「身份」?如果是,我應該在哪裏放置枚舉?在用戶實體(User.Status)或某些特定包(com.example.enums.UserStatusEnum)內?
  2. 我應該將它映射爲表Status { ID INT NOT NULL, CODE CHAR(5) }並讓應用程序管理它嗎?或者甚至創建一個新列(ENTITY CHAR(5))來指定該狀態對應的實體?
  3. 更改枚舉有一個屬性來指定它的實體?

我不明白我應該遵循什麼路徑。你有另外一個建議嗎?

請記住,可以有更多的實體,每個實體都有一組不同的狀態。但是這些狀態並不會經常改變,所以我真的不相信我需要在我的數據庫上使用表格。

回答

0

僅從應用程序端設計實體。然後設計一個匹配的數據庫模式來堅持它們 - 因此數據庫完全從屬於應用程序。

避免「重複使用」實體,如狀態。也許今天不同實體的地位是一致的,但明天它們不會。另外,一些實體只能被允許擁有一個狀態子集。你會很快陷入一片混亂。並保存什麼?幾行和幾張小桌子。不值得。

創建單獨的枚舉,例如UserStatus。忽略一些狀態值在實體之間共享的事實。

+0

謝謝你的幫助! 但我有點困惑。在第二段中,我明白你告訴我要使用很多表格,每種表格都需要一張表格。但在下一個你說使用多個枚舉。哪種方法更好? 另外,如果使用枚舉,我應該如何編碼?它是一個枚舉實體?還是一個包含很多枚舉的大包?有沒有設計模式? – MiguelKVidal

+0

你還有什麼要添加到你的答案嗎?根據我在回答中的最後一條評論,您是否有其他建議? – MiguelKVidal

+0

@MiguelKVidal你需要更多的枚舉和更多的表(每個枚舉的表)。我不會把這個枚舉放在一個類中。只需將它們放在與其他模型類相同的包中即可。 – Bohemian