【问题标题】:Dynamic @Table name based on input基于输入的动态@Table 名称
【发布时间】:2017-11-06 16:40:08
【问题描述】:

我们有基于 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 结果集,我如何将 @Table 属性动态映射到 UserTickets Java 对象上,以便我的 Criteria API 查询将自动工作而无需将它们更改为 HQL 查询?

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

【问题讨论】:

  • 我是否理解正确:您有一个用户 ID,并且您想使用该用户 ID 进行查询,并且基于该 ID,它应该针对 UserTickets 或 RestOfWorldTickets。而且您可能不想使用具有 Internal_id | 的映射表。用户ID |表映射 ?

标签: java hibernate queryinterceptor


【解决方案1】:

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

1st修改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 进行测试,因此此解决方案可能存在一些差异/问题...

【讨论】:

  • 感谢 pirho 的回复。我已将第三个表名的名称更新为“TableMapping”,并且还向我的 Java Pojo 添加了@Id 属性。但是,“TableMapping”表与查询应该使用的表有明显的区别。如何动态确定?注意:也有可能出现第三张表,我的 java 代码应该动态路由查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2015-04-24
  • 2014-02-03
  • 2012-04-14
相关资源
最近更新 更多