2017-11-06 8 views
0

大規模なデータセットのために、user_idがUserTicketsテーブルまたはRestOfWorldTicketsテーブルにマッピングされる2セットのテーブルが作成されるHibernateベースのアプリケーションがあります。 エンティティJavaオブジェクトの@Tableが、ユーザの選択に基づいて動的にマッピングされる方法を知りたいですか? UserTicketsを使用してダイナミック@Table名(入力ベース)

ので
@Entity 
@Table(name = "**UserTickets**") 
public class UserTickets { 

    @Id 
    @Column("Internal_id") 
    @GeneratedValue(strategy = IDENTITY) 
    private int internalId; 

    @Column("user_id") 
    private int userId; 

    @Column("state") 
    private String state; 

    @Column("city") 
    private String city; 

    @Column("address") 
    private String address; 

    @Column("ticketNumber") 
    private String ticketNumber; 
    .. 
    // Setters and Getters 

} 

UserTickets DB Table 
Internal_id | User_id | State | City | Address | ticket_number | ... 
101   | 1025 | AZ  | Tuscan | ..  | 10256912  | 
102   | 1026 | NC  | Durham | ..  | 10256983 

RestOfWorldTickets DB Table 
Internal_id | User_id | State | City | Address | ticket_number |.. 
101   | 1058 | {null} | London | ..  | 102578963  |.. 
102   | 1059 | {null} | Berlin | ..  | 112763458  |.. 


The user and table mapping are now defined in a new table. 

TableMapping Database table. 
Internal_id | User_id | TableMapped  | 
1   | 1025  | UserTickets  | 
2   | 1026  | UserTickets  | 
3   | 1058  | RestOfWorldTickets | 
4   | 1059  | RestOfWorldTickets | 

は、私の基準APIのクエリはHQLクエリにそれらを変更することなく、自動的に動作するように私は動的にUserTickets Javaオブジェクトに@Table属性をマップする方法、結果セット?

インターセプタを使用している可能性がありますhttp://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Interceptor.html

+0

...ので、この解決策のいくつかの違い/ probkemsが可能使用してopenjpaでテストしていを理解していました:あなたは、ユーザーIDを持っている、あなたはそれでクエリを作成したいですこのidに基づいて、 'UserTickets'または' RestOfWorldTickets'に対抗するべきです。また、おそらく_Internal_id |を持つマッピングテーブルを使用したくないでしょう。 User_id | TableMapped_? – pirho

答えて

0

私はあなたが実際に必要としていることはかなり確信していますが、私はいくつかの質問に基づいて私のソリューションを提供しようとしています。 @Tableを変更すると、動的に可能-afaik-されていませんが、私は右の推測場合は、この場合における相続のいくつかの利点を持つことができます:

第一継承

@Entity 
//@Table(name = "**UserTickets**") 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class UserTickets { 

    @Id // this annotation was missing from yours ? 
    @Column(name="Internal_id") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
     // identity generated problems in openjpa so i changed it to SEQUENCE 
    private int internalId; 
    @Column(name="user_id") private int userId; 
    @Column(name="state") private String state; 
    @Column(name="city") private String city; 
    @Column(name="address") private String address; 
    @Column(name="ticketNumber") private String ticketNumber; 
} 

第二は新しいを作成できるようにUserTicketsを変更しますエンティティ

@Entity 
public class RestOfWorldTickets extends UserTickets { 
    // yes i am just an empty class, TABLE_PER_CLASS gives me the fields 
} 

これにより、UserTicketsではなく広告内でcriteriaqueriesを使用できます照会はRestOfWorldTicketsに対しても行われます。だから、ユーザーIDで検索すると結果セットには両方のテーブルの結果が含まれます。チェック/ロギング - 例としてinstanceofオペレーター - あなたはチケットがどれであるかを見ることができます。私は正しい

「免責事項」私は

+0

返信いただきありがとうございますpirho ..私は3番目のテーブル名の名前を "TableMapping"に更新しました。また、@Id属性もJava Pojoに追加しました。しかし、 'TableMapping'テーブルでは、どのテーブルにクエリを行うべきかが明確に区別されます。どのように動的に決定するのですか?注:3番目のテーブルも出てくる可能性があります。私のJavaコードでは、クエリを動的にルーティングする必要があります。 –