2012-02-06 81 views
2

假設我有一個系統對用戶操作進行審計: 就像一個叫做XXX的用戶做了一杯茶,然後做了...,然後做...玩!框架:如何將一個實體從父類中推廣爲子類

所以與UserActions表(用戶ID,actionId)

現在用戶已經結婚,現在我-On他系統 - 能有孩子,所以我想,以促進正常的用戶實體到可以有兒童列表的已婚用戶實體(其他正常用戶實體)

like: 具體的母實體:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class User extends Model { 
} 

具體子實體:

@Entity 
public class MarriedUser extends User { 
    @OneToMany() 
    public List<User> children; 
} 

,我的問題是,如何把代碼寫在控制器從父(用戶)促進在數據庫中的實體子(MarriedUser) - 通常這是在數據庫中完成的,只需在MarriedUser表中插入一個具有相同用戶標識的記錄(因爲我將InheritanceType加入),所以在數據庫中它很簡單,但是hibernate代碼就是我所做的不知道。

我告訴你的審計信息的一部分,因爲我不能只刪除用戶XXX和創建一個新的ID與新的結婚用戶,我需要它與相同的ID。

所以請幫助我的Hibernate代碼...

回答

2

我認爲你正面臨因爲繼承的濫用問題。

您不能在不丟失其對象標識的情況下更改對象的類型,因此,您不應該使用繼承來表示同一對象的不同狀態,因爲您正在嘗試執行此操作。

您可以使用不同的對象來表示的User婚姻狀況:

@Entity 
public class User extends Model { 
    @OneToOne 
    public Marriage marriage; 
    ... 
} 

@Entity 
public class Marriage extends Model { 
    @OneToMany() 
    public List<User> children; 
} 

或者,你可以移動到childrenUser,並使用一些標記來表示婚姻狀況,如果你需要。

是的,據我所知,沒有辦法改變Hibernate中現有實體的類型。

0

我相信你是以錯誤的方式接近你的問題。你在這裏得到的是一個'state machine',其中一個實體(你的用戶)可以處於允許/禁止某些動作的狀態。

您可以通過減少實體的狀態及其存儲來獲得更多成功。使用枚舉(或類似的)來存儲狀態,然後在試圖觸發模型上的操作時檢查狀態是否正確。如果它不是有效的狀態,則引發異常。

您的用戶界面應根據狀態代碼限制可用操作的範圍。

@Entity 
public class User extends Model { 

    // this status code could be an enum, or any other type that fits 
    public int statusCode; 

    ... 

    public void action() { 
     if(statusCode != 1){ 
      throw new IllegalStateException("State 1 required for this action"); 
     } 
     //code for action 
    } 
} 
相關問題