Hibernate多个外键

时间:2015-07-07 10:48:38

标签: java sql hibernate

我是hibernate的新手。

我的问题是将多个外键解析为其值。我能用SQL做到这一点,但Hibernate Annotations让我发疯。

我得到了这两个表格,例如:

表格移动

  • MoveSet_ID
  • Punch_1
  • Punch_2
  • Graple_1
  • Graple_2
  • Graple_3
  • Graple_4

表移动

  • Move_ID
  • 姓名
  • 损伤
  • MoveType_ID
  • Counterchance

“打孔”和“Graples”都是引用Move_ID的外键。

我的目标是执行session.createQuery("from MoveSets").list();并使用移动的名称而不是ID来获取Moveset。

这可能在Hibernate中吗?

package hibernate;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "Moves")
public class Moves implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -1522367877613954187L;
private int id;
private String name;
private int damage;
private int movetype_id;
private int counterchance;

public Moves() {

}

public Moves(int id, String name, int damage, int movetype_id,
        int counterchance) {
    this.id = id;
    this.name = name;
    this.damage = damage;
    this.movetype_id = movetype_id;
    this.counterchance = counterchance;
}

@Id
@Column(name = "Move_ID")
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Column(name = "Name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Column(name = "Damage")
public int getDamage() {
    return damage;
}

public void setDamage(int damage) {
    this.damage = damage;
}

@Column(name = "MoveType_ID")
public int getMovetype_id() {
    return movetype_id;
}

public void setMovetype_id(int movetype_id) {
    this.movetype_id = movetype_id;
}

@Column(name = "Counterchance")
public int getCounterchance() {
    return counterchance;
}

public void setCounterchance(int counterchance) {
    this.counterchance = counterchance;
}

@Override
public String toString() {
    return "Moves - Name: " + name;
}
}

package hibernate;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "MoveSets")
public class MoveSets implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = -6488498413048804953L;

private int id;
private int punch_1;
private int punch_2;
private int graple_1;
private int graple_2;
private int graple_3;
private int graple_4;

public MoveSets() {

}

public MoveSets(int id, int punch_1, int punch_2, int graple_1,
        int graple_2, int graple_3, int graple_4) {
    this.id = id;
    this.punch_1 = punch_1;
    this.punch_2 = punch_2;
    this.graple_1 = graple_1;
    this.graple_2 = graple_2;
    this.graple_3 = graple_3;
    this.graple_4 = graple_4;
}

@ManyToOne
@JoinColumn(name = "Moves_ID")
public Moves moves;

@Id
@Column(name = "MoveSet_ID")
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Column(name = "Punch_1")
public int getPunch_1() {
    return punch_1;
}

public void setPunch_1(int punch_1) {
    this.punch_1 = punch_1;
}

@Column(name = "Punch_2")
public int getPunch_2() {
    return punch_2;
}

public void setPunch_2(int punch_2) {
    this.punch_2 = punch_2;
}

@Column(name = "Graple_1")
public int getGraple_1() {
    return graple_1;
}

public void setGraple_1(int graple_1) {
    this.graple_1 = graple_1;
}

@Column(name = "Graple_2")
public int getGraple_2() {
    return graple_2;
}

public void setGraple_2(int graple_2) {
    this.graple_2 = graple_2;
}

@Column(name = "Graple_3")
public int getGraple_3() {
    return graple_3;
}

public void setGraple_3(int graple_3) {
    this.graple_3 = graple_3;
}

@Column(name = "Graple_4")
public int getGraple_4() {
    return graple_4;
}

public void setGraple_4(int graple_4) {
    this.graple_4 = graple_4;
}

@Override
public String toString() {
    return "MoveSet - ID: " + id + " Punch 1: " + punch_1;
}
}

1 个答案:

答案 0 :(得分:0)

是的,有可能,事实上,ORM和Hibernate的重点是获取普通ID的对象(您的值)。你的映射是错误的。您应该通过@OneToOne@OneToMany之类的注释来映射您的关系(我假设拳和擒抱是移动),因此您的字段会与@JoinColumn一起映射

@Column(name = "Graple_1")
public int getGraple_1() {
    return graple_1;
}

应该像

@ManyToOne
@JoinColumn(name="Graple1")
public Move getGraple_1() {
    return graple_1;
}

通过这种方式,您将获得相关的Move个对象,并从中获取所需的任何数据,以及所请求的name