2013-03-18 103 views
2

對於在我們的項目的要求之一,我們以下幾點:JPA + Hibernate映射爲擴展表

http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_nvp來管理多個租戶。

請參考上面的表格結構圖的鏈接。

我需要幫助來管理映射。這是我在想什麼:

@Entity 
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
    public abstract class AbstractEntity { 
    @Id @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 

    @OneToMany(mappedBy="entities") 
    private Set<ExtensionTable> extensionTable = new HashSet<ExtensionTable>(); 

    .... 
} 


@Entity 
public class ExtensionTable { 
    @Id @GeneratedValue 
    private Long id; 

    @ManyToOne 
    private Set<AbstractEntity> entities = new HashSet<AbstractEntity>(); 

    ... 
} 

@Entity 
public class Employee extends AbstractEntity { 
    ... 
} 

我發現很難定義元數據表的映射。

回答

2

從規範11.1.26:ManyToOne註釋定義了一個單值關聯到另一個具有多對一多重性的實體類。 我不認爲你可以在Set中使用@ManyToOne。 我會嘗試這樣的:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // Depending on your provider, I generally use JOINED or SINGLE_TABLE 
public abstract class AbstractEntity { 
    @Id @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 

    @OneToMany(mappedBy="entity") 
    private Set<ExtensionTable> extensionTable = new HashSet<ExtensionTable>(); 

    .... 
} 


@Entity 
public class ExtensionTable { 
    @Id @GeneratedValue 
    private Long id; 

    @ManyToOne 
    private AbstractEntity entity; 

    @ManyToOne 
    private Metadata metadata;  

    @Column 
    private String value; 

    ... 
} 

@Entity 
public class Metadata { 
    @Id @GeneratedValue 
    private Long id; 

    @ManyToOne 
    private AbstractEntity entity; 

    @Column 
    private String extLabel;   

    @Column 
    private String extDataType; // So, here is a problem, you'll have to find an efficient way to deal with the data type. 
    ... 
} 

@Entity 
public class Employee extends AbstractEntity { 
    ... 
} 
0

我的不好,我沒有想到它通過。以下是最終代碼:

@Entity 
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
    public abstract class AbstractEntity { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name="TENANT_ID") 
private int tenantId; 

@OneToMany(mappedBy="entity",cascade=CascadeType.ALL,fetch = FetchType.EAGER) 
private Set<ExtensionTable> extensionTable = new HashSet<ExtensionTable>(); 

..... 
} 


@Entity 
@Table (name="metadata") 
public class MetaData { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long metaDataId; 

@Column 
int tenantId; 

@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="extensionId") 
    private ExtensionTable extension; 

@Column 
String extLabel; 

@Column 
String extDataType; 

    ..... 

    } 

@Entity 
@Table(name = "extensionTable") 
public class ExtensionTable { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long extensionId; 

@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="ENTITY_ID") 
    private AbstractEntity entity; 

@OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER) 
@JoinColumn(name="metadata_id") 
private MetaData metaDatas = new MetaData(); 

    .... 

    }