如何在hibernate中创建Many-One Mapping?

时间:2010-09-22 06:39:42

标签: java hibernate orm

我想在两个表格之间创建多个映射,费用(ID,NAME,CATEGORY)和 类别(ID,NAME)。 在我的课堂上,我创建了一个字段'Category category'及其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配置进行映射。我认为,注释对像我这样的初学者来说是好事。

我老了! 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中使用内连接?

任何建议!!

谢谢!


更新

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

要测试我设置表中的'userName = Tamil'。 Hibernate生成的查询如下所示,

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

作为初学者,我对JPQL有一些疑问,我希望来自catName表的Category[catId, catName]catId也可以在Expens[expnsId, catId, userName]中使用catName

通过在Expens.java类中添加以下行,它将如何为Expens提供@ManyToOne private Category category // getters, setters 表中的其他变量。

Query query = hSession.createQuery("SELECT e FROM Expens e JOIN e.category c WHERE e.userName = :userName").setParameter("userName", userName);

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

我使用的查询是pascal的版本:{{1}}

对我来说,hibernate生成的查询与我的旧SQl查询看起来相同。我在这里找不到问题。

3 个答案:

答案 0 :(得分:4)

实际上,在您的案例中有用的文档的很大一部分位于Hibernate Annotations Reference Guides(下面提供的链接)中。阅读它将非常值得。

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

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

    @ManyToOne
    private Category category

    // getters, setters
    ...
}

这就是全部。

如果你想使它成为双向的,你必须在另一边添加OneToMany(并且不要忘记mappedBy元素,因为关联是双向的):< / p>

@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());
}

参考

答案 1 :(得分:2)

Expense班级中有:

@ManyToOne
@JoinColumn(name="CATEGORY_ID")
private Category category

正如评论中所指出的,如果您需要访问给定类别中的所有费用,即具有一对多关系,您可以:

@OneToMany
private List<Expense> expenses;
例如,我喜欢使用尽可能少的@OneToMany映射 - 你必须管理急切/延迟加载,在某些时候限制结果的数量等。对于他们我倾向于使用用于获取我需要的对象子集(在您的情况下为费用)的HQL查询。

答案 2 :(得分:2)

正如Bozho所说,

@ManyToOne(fetch=FetchType.EAGER) // Gonna be eager by default anyway
@JoinColumn(name="CATEGORY_ID")
private Category category;

在你的Category类中加上它以使其成双向,

@OneToMany(mappedBy="category")
private List<Expense> expense;

你不需要做那样的内部联接。查询费用时,相关类别将自动加载,最有可能使用加入。