gpt4 book ai didi

sql - Hibernate 如何最好地处理关联表/外键?

转载 作者:行者123 更新时间:2023-12-04 06:00:58 25 4
gpt4 key购买 nike

我使用 schemaExport 来创建这样的表

  Configuration config = new Configuration();
config.addAnnotatedClass(Categories.class);
config.addAnnotatedClass(Article.class);
config.configure();
new SchemaExport(config).create(true, true);

Categories.java 和 Article.java 的重要部分是这些:
Article.java

@Id
@GeneratedValue
public Long getId() {
return id;
}

@OneToMany( cascade = CascadeType.ALL )
public Set<Categories> getCategories() {
return categories;
}

Categories.java

@Id
@GeneratedValue
public Long getId() {
return id;
}

@ManyToOne(cascade = CascadeType.ALL)
public Article getArticleCategories() {
return articleCategories;
}

运行时,Schema Export 生成三个表:Article、Categories 和 article_categories。 article_categories 是一个关联表,有两个主键与来自文章和类别的键匹配。只有文章和类别已添加到我的 ApplicationContext.xml 中的 SessionFactory 中,因为自从它生成以来,我显然没有将第三个表作为类。我写了这个HQL:
"from Article a, article_categories ac, Categories c where ac.Article_id = a.id and ac.categories_id = c.id and c.category = 'p'"

Hibernate 无法运行它,因为 article_categories 未映射。我需要映射它吗?运行 native SQL 而不是 HQL 是一种可能的替代方法,还是应该一起避免关联表?这个问题的解决方案是什么?

最佳答案

HQL 不适用于表。它适用于实体及其关联。在 HQL 查询中的实体之间创建连接,Hibernate 将使用连接表为您生成适当的 SQL。

例子:

select a from Article a 
inner join a.categories c
where c.category = :categoryName

阅读(至少) the HQL section of the reference manual .

旁注:实体的名称应该是单数:类别而不是类别。因此,一篇文章具有 Set<Category> , 名为 categories .这样更容易阅读和理解。和 category类别字段应命名为 name : 这是类别的名称,而不是其类别。

关于sql - Hibernate 如何最好地处理关联表/外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8906224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com