【问题标题】:Foreign key usage in Java with HibernateJava 中的外键使用与 Hibernate
【发布时间】:2014-10-01 15:07:35
【问题描述】:

我正在尝试开发一个 Web 应用程序,我想知道是否有一种方法可以在不编写大量代码的情况下使用外键。

我的学员.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:uaiContacts.model.Trainees.status_TraineeID 上的@OneToOne 或@ManyToOne 引用了未知实体:字符串

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

我正在使用模型、控制器、hibernate 和 angularjs 来显示到视图中,我真的不想通过所有这些来传递表格,我认为使用 ManyToOne 或 JoinColumns 之类的东西会检索值?

感谢大家的帮助!

【问题讨论】:

标签: java mysql sql angularjs hibernate


【解决方案1】:

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

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

【讨论】:

  • 您好,感谢您的回复,我包含了 @ManyToOne @JoinColumn(name = "status_trainee") 而不是 int 我实现了字符串,但问题是无法将实体识别为字符串或整数,是否需要不同的结构?
  • 您不应该使用 id 的字段作为参考,而是整个对象。 Hibernate 会知道使用外键。所以使用私有Status_Trainee statusTrainee;作为变量并对其进行注释。注释像 int 这样的原始类型没有意义。
  • 感谢解决了这个问题。 :)
【解决方案2】:

首先,在使用hibernate时,不建议在类名中使用“_”。 Hibernate 在访问外键时使用下划线。因此,假设您将您的课程重命名为:TraineeStatus 并且 id 将其更改为 traineeStatusId..

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

@OneToMany : 一个实习生可以有很多状态

@ManytoOne : 许多学员可以拥有相同的身份

@OneToOne : 一个实习生只能有一个状态,反之亦然。

试试这个:

@实体 公开课学员{

@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 表中有此列(作为整数),您就完成了:)..

就是这样。。 希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多