java - 如何在 hibernate 中创建多对一映射?

标签 java hibernate orm

我想在两个表格 Expense(ID, NAME, CATEGORY) 和 类别(ID,名称)。 在我的类里面,我创建了一个字段“类别类别”及其 setter 和 getter 。 我是在网上看到一些东西后才做的。我必须在我的 Category.java 类中做哪些更改。现在,它看起来像,

public class Category{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int catId;
private String catName;

public Category() {
}

public int getCatId() {
    return this.catId;
}

public void setCatId(int catId) {
    this.catId = catId;
}

public String getCatName() {
    return this.catName;
}

public void setCatName(String catName) {
    this.catName = catName;
}

}

我不想用 xml 配置做映射。我认为,注释对像我这样的初学者很有用。

还有我的老 friend ! SQL 查询看起来像,

SELECT EXPENSES.EXPNS_ID、EXPENSES.CAT_ID、EXPENSES.NAME、CATEGORY.CAT_NAME FROM EXPENSES INNER JOIN CATEGORY ON EXPENSES.CAT_ID = CATEGORY.CAT_ID WHERE USER_NAME="+currentUserName

如何在Hibernate中使用inner join?

任何建议!

谢谢!


更新

感谢所有回答者, 我试过你所说的,它返回一个空列表。

为了测试,我设置了表中的“userName=Tamil”。 Hibernate 生成的查询如下所示,

选择 expens0_.expnsId as expnsId1_,expens0_.catId as catId1_,expens0_.category_catId as category7_1_,expens0_.userName as userName1_ from Expens0_ inner join Category catId1_ on expens0_.category_catId=category1_.catId where expens0_.userName= ?

作为初学者,我对 JPQL 有一些疑问,我想从 Category[catId, catName] 表中获取 catNamecatId 也可以在 Expens[expnsId, catId, userName] 中使用。

通过在 Expens.java 类中添加以下行,它将如何为我提供 catName 以及 Expens 表中的其他变量。

@ManyToOne
private Category category

// getters, setters

我无法理解它。如果不理解这一点,我就无法继续前进,我必须在我的项目中提供更多映射。如果清楚这个映射,我可以放心地移动到其余部分。

我使用的查询是 pascal 的版本:Query query = hSession.createQuery("SELECT e FROM Expens e JOIN e.category c WHERE e.userName = :userName").setParameter("userName", userName) ;

对我来说,hibernate 生成的查询看起来和我的旧 SQL 查询一样。我在这里找不到问题。

最佳答案

实际上,对您的情况有用的文档的很大一部分位于 Hibernate 注释引用指南(下面提供的链接)中。阅读它会是非常值得的。

话虽如此,关于您的具体问题,最简单的映射可能是:

@Entity
public class Expense {
    @Id @GeneratedValue
    private Long;

    @ManyToOne
    private Category category

    // getters, setters
    ...
}

就是这样。

如果你想让它成为双向的,你必须添加一个 OneToMany另一方面(不要忘记 mappedBy 元素,因为关联是双向的):

@Entity
public class Category {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(mappedBy="category")
    private Set<Expense> expenses = new HashSet<Expense>();
    ....
}

一个可能的 JPQL 查询是:

SELECT e FROM Expense e JOIN e.category c WHERE e.username = :username  

更新:Hibernate 和JDBC 是不同的。使用 Hibernate,您需要考虑对象,上面的 HQL 查询(更多的是一个示例)实际上将返回 List<Expense>。 .要获取类别名称,请迭代结果并浏览关联。例如:

List<Expense> expenses = ... // some code to retrieve a list by username

for (Expense expense : expenses) {
    System.out.println(expense.getCategory().getName());
}

引用资料

关于java - 如何在 hibernate 中创建多对一映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3766880/

相关文章:

java - Java 线程每秒常量 "ticks"

java - 具有增强 for 循环的字符串数组

java - 具有多个条件的 for 循环的大 O

java - 检测 Hibernate 中的重复行

java - hibernate创建SessionFactory对象时出错.javax/transaction/SystemException和NullPointerException

java - Hibernate setParamater 一个类

java - Hibernate 4 字节码增强不适用于脏检查优化

java - Eclipse Gradle 插件生成数百个进程

java - hibernate 抛出 "deleted object would be re-saved by cascade (remove deleted object from associations)"

java - org.hibernate.TypeMismatchException : Provided id of the wrong type while fetching data