从3个表定义hibernate实体

时间:2017-08-30 16:02:51

标签: java mysql hibernate

我正在研究遗留应用程序,并且我被要求集成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();

1 个答案:

答案 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