使用Hibernate在Java中使用外键

时间:2014-10-01 15:07:35

标签: java mysql sql angularjs hibernate

我正在尝试开发一个Web应用程序,我想知道是否有一种方法可以利用外键而无需编写大量代码。

My Trainees.java

@Entity
public class Trainees {

    @Id
    @GeneratedValue
    private int traineesID;
    private int groupsID;
    @ManyToOne
    @JoinColumn(name = "status_trainee")
    private String status_TraineeID;
    private int customersID;
    private String name;
    private String surname;
    private String phoneDetails;
    private String email;

    public Trainees(){

    }

    public Trainees(String name, String surname, String phoneDetails, String email, int id, int groupsID, String status_TraineeID, int customersID) {
        super();
        this.name = name;
        this.surname = surname;
        this.email = email;
        this.phoneDetails = phoneDetails;
        this.groupsID = groupsID;
        this.status_TraineeID = status_TraineeID;
        this.customersID = customersID;
    }

    //getters and setters

    @Override
    public boolean equals(Object object) {
        if (object instanceof Trainees){
            Trainees contact = (Trainees) object;
            return contact.traineesID == traineesID;
        }

        return false;
    }

    @Override
    public int hashCode() {
        return traineesID;
    }
}

Status_Trainee.java

@Entity
public class Status_Trainee {

    @Id
    @GeneratedValue
    private int status_traineeID;
    private String value;

    public Status_Trainee(){

    }

    public Status_Trainee(String value, int id) {
        super();
        this.value = value;
    }

    //getters and setters

    @Override
    public boolean equals(Object object) {
        if (object instanceof Status_Trainee){
            Status_Trainee value = (Status_Trainee) object;
            return value.status_traineeID == status_traineeID;
        }

        return false;
    }

    @Override
    public int hashCode() {
        return status_traineeID;
    }
}

错误:由org.hibernate.AnnotationException引起:@OneToOne或uaiContacts.model.Trainees.status_TraineeID上的@ManyToOne引用了一个未知实体:String

所以我的目标是使用Trainees表和类,我可以使用外键检索Status_Trainee表的值。例如:如果外键ID为2,那么它将从status_trainee表中检索一个字符串,其中主键与外键ID匹配。

我正在使用模型,控制器,hibernate和angularjs来显示视图,我真的不想通过这一切传递表,我想使用类似ManyToOne或JoinColumns的东西会检索值?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您应该在Trainee中添加对StatusTrainee的引用,并使用OneToMany,ManyToOne或OneToOne对其进行注释。根据您需要哪种关系,您需要StatusTrainee列表或只需要StatusTrainee。

提示:不要在类名中使用下划线。

答案 1 :(得分:1)

首先,不建议使用" _"在使用hibernate时在类名中。访问foreignKeys时,Hibernate使用下划线。所以让我们假设您将您的班级重命名为: TraineeStatus 并且ID将其更改为 traineeStatusId ..

其次,您可以根据需要使用Hibernate注释。但首先你需要知道这种关系是怎样的:

@OneToMany :一名受训者可以有很多状态

@ManytoOne :许多受训者可以拥有相同的身份

@OneToOne :一名受训者只能拥有一种状态,反之亦然。

试试这个:

@Entity 公共班级学员{

@Id
@GeneratedValue
private int traineesID;
private int groupsID;

@OneToOne
private TraineeStatus status;
private int customersID;
private String name;
private String surname;
private String phoneDetails;
private String email;

...

您可以根据需要更改@OneToOne ..

请记住,hibernate会尝试在你的Trainees mysql表中将它映射为status_traineeStatusId,所以如果你在trainess table中有这个列(作为一个整数),你就完成了:)..

就是这样.. 希望它有所帮助