基于输入

时间:2017-11-06 16:40:09

标签: java hibernate queryinterceptor

我们有基于Hibernate的应用程序,由于大型数据集,会创建两组表,其中user_id将映射到UserTickets表或RestOfWorldTickets表中。 想知道如何根据一些用户选择动态映射实体java对象上的@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 |

那么,使用UserTickets结果集,如何动态映射UserTickets Java对象上的@Table属性,以便我的Criteria API查询能够自动运行而不会将它们更改为HQL查询?

也许使用拦截器http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Interceptor.html

1 个答案:

答案 0 :(得分:0)

我很不确定你真正需要什么,但我试着根据一些问题给出我的解决方案。动态更改@Table不是-afaik-可能但如果我猜对了,在这种情况下你可以获得继承的一些好处:

第一次修改UserTickets以允许继承

@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;
}

第二次创建一个新实体

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

这允许您对UserTickets使用条件查询,但此外,查询也是针对RestOfWorldTickets完成的。因此,当您使用用户ID进行搜索时,结果集将包含来自两个表的结果。检查/登录 - 例如使用instanceof运营商 - 您可以看到该票证是哪一个。

"声明"我正在使用openjpa进行测试,因此这个解决方案可能存在一些差异/问题......