2

私たちのプロジェクトの要件の1つについて、次のことを行っています。

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 {
    ...
}

メタデータ テーブルのマッピングを定義するのが難しいと感じています。

4

2 に答える 2

2

仕様 11.1.26 か​​ら: ManyToOne アノテーションは、多対 1 の多重度を持つ別のエンティティ クラスへの単一値の関連付けを定義します。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 {
    ...
}
于 2013-03-19T16:03:47.843 に答える
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();

    ....

    }
于 2013-03-19T23:48:46.847 に答える