我们有基于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?
答案 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
进行测试,因此这个解决方案可能存在一些差异/问题......