我正在研究遗留应用程序,并且我被要求集成Hibernate(这是我第一次使用它)。这个应用程序有3个表(以及其他)如下:
@JoinTable
然后我需要根据为应用程序定义的语言,将PARAMS中的参数及其翻译存储在TRANS中,该语言存储在SITE中。
我一直在努力了解如何连接表来获取实体的数据。我尝试使用@SecondaryTables
,但我无法弄清楚如何进行3向连接,所以我开始尝试使用@Entity
@Table(name = "params")
@SecondaryTables(
{
@SecondaryTable(name = "trans", pkJoinColumns = @PrimaryKeyJoinColumn(name = "p_id")),
})
public class Tparam implements Serializable
{
@Id
@GeneratedValue
@Column(name = "p_id")
private int id;
@Column(name = "name")
private String Name;
@Column(name = "text")
private String visibleText
...
}
而没有运气。
我定义了这个实体来映射请求的数据(我知道这不会像现在这样工作)而且我正在试图找出正确的连接方式。
SELECT * FROM params, lang, site WHERE params.p_id = lang.p_id AND lang.lang_id = site.lang_id;
感谢任何帮助!
作为参考,这个SQL查询给了我想要的东西:
var method = typeof(DbContext).GetMethod("Set").MakeGenericMethod(targetType);
var query = method.Invoke(ctx, null) as IQueryable;
var list = query.OfType<object>().ToList();
答案 0 :(得分:1)
您需要定义3个实体:
1-PARAM 2,郎 3站点
@Entity
@Table(name = "params")
public class Tparam implements Serializable
{
@Id
@GeneratedValue
@Column(name = "p_id")
private int id;
@Column(name = "name")
private String Name;
@Column(name = "text")
private String visibleText
...
}
@Entity
@Table(name = "lang")
public class Lang implements Serializable
{
@Id
@GeneratedValue
@Column(name = "lang_id")
private int id;
@ManyToOne
@JoinColumn(name = "p_id")
private Tparam param;
...
}
@Entity
@Table(name = "site")
public class Site implements Serializable
{
@Id
@GeneratedValue
@Column(name = "site_id")
private int id;
@ManyToOne
@JoinColumn(name = "lang_id")
private Lang lang
...
}
然后,当您需要数据时,可以使用Site
实体上的Criteria(或Query)来获取数据。每个网站记录都包含一个Lang
,每个记录包含一个Tparam
。