【问题标题】:hibernate4: A Foreign key refering has the wrong number of column. should be 2hibernate4:外键引用的列数错误。应该是 2
【发布时间】:2014-10-09 12:58:29
【问题描述】:

我正在尝试使用 Hibernate 注释为我的数据库表编写模型类。

我有两个表,每个表都有一个主键 UserChartDetails

package com.winnow.springservice.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


//User Entity class mapped with hibernate
@Entity
@Table(name="User")
@SuppressWarnings(value = { "all" })
public class User implements Serializable
{

@Id
@Column(name="user_id")
public String user_Id;

@Column(name="user_name")
public String userName;
public String password;

@Column(name="last_login")
public String last_Login;

@Column(name="role_id")
public int role_Id;
public int status;




public String getUser_Id() {
    return user_Id;
}

public void setUser_Id(String user_Id) {
    this.user_Id = user_Id;
}

public String getLast_Login() {
    return last_Login;
}

public void setLast_Login(String last_Login) {
    this.last_Login = last_Login;
}

public int getRole_Id() {
    return role_Id;
}

public void setRole_Id(int role_Id) {
    this.role_Id = role_Id;
}

public int getStatus() {
    return status;
}

public void setStatus(int status) {
    this.status = status;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {

    System.out.println("username"+userName);
    this.userName = userName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password)
{
    System.out.println("password "+password);
    this.password = password;
}


}

图表详情

package com.winnow.springservice.domain;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Chart_Details")
@SuppressWarnings(value = { "all" })
public class ChartDetails implements Serializable
{

@Id
@Column(name="chart_id")
public int chartId;

@Id
@Column(name="chart_type_id")
public int chartTypeId;

@Column(name="chart_name")
public String chartName;

@Column(name="x_axis")
public String x_axis;

@Column(name="y_axis")
public String y_axis;

@Column(name="z_axis")
public int z_axis;

@Column(name="chart_filter_id")
public int chartFilterId;

@Column(name="is_data_table")
public boolean isDataTable;

@Column(name="dataset_id")
public int datasetId;

@Column(name="user_id")
public int userId;


@Column(name="project_id")
public int projectId;

}

我还有一张表——ChartsStarredBy——它有userIdchart_id作为上述两个表的外键。

但我无法找到如何在 ChartsStarredBy 表中引用这些约束。

package com.winnow.springservice.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@Entity
@Table(name="Chart_Starred_By")
@SuppressWarnings(value = { "all" })
public class ChartsStarredBy implements Serializable
{

@Id
public int id;

@Temporal(TemporalType.DATE)
public Date starred_date;


@ManyToOne
@JoinColumn(name = "FK_chart_id4")
private  ChartDetails chart_details;

@ManyToOne
@JoinColumn(name = "FK_user_id4")
private User user;

public Date getStarred_date() 
{
    return starred_date;
}

public void setStarred_date(Date starred_date) 
{
    this.starred_date = starred_date;
}

public User getUser() 
{
    return user;
}

public void setUser(User user) 
{
    this.user = user;
}

public ChartDetails getChart_details() {
    return chart_details;
}

public void setChart_details(ChartDetails chart_details) {
    this.chart_details = chart_details;
}

}

请帮我实现这个?提前致谢。

【问题讨论】:

  • 在发帖前请删减源代码。不要让我们对自动生成的 JavaDoc 感到厌烦。使用一致的缩进,以便源代码突出显示。所有这些都是对您期望帮助的人的礼貌。
  • 你的问题标题是什么意思?这是您收到的错误消息吗?我在你的代码中看不到任何“Hibernate annotations”——这都是标准的 JPA。

标签: java hibernate jpa hibernate-mapping hibernate-annotations


【解决方案1】:

首先你应该为用户表创建一个整数 id,它是主键。在您的代码中,您将其创建为 String 类型。

你在这里做错了

@ManyToOne
@JoinColumn(name = "FK_chart_id4")
private  ChartDetails chart_details;

@ManyToOne
@JoinColumn(name = "FK_user_id4")
private User user;

您在 User 表和 ChartDetails 表中有 ID

@Id
@Column(name="user_id")
public String user_Id;

AND

@Id
@Column(name="chart_id")
public int chartId;

因此,当您引用另一个类的 id 时,您应该在 @JoinColumn 中给出该 id 的名称。就这样

@ManyToOne
@JoinColumn(name = "chartId")
private  ChartDetails chart_details;

@ManyToOne
@JoinColumn(name = "user_Id")
private User user;

您也可以像这样使用 Hibernate 中的 @ForeignKey(name = "user_Id") 注释

@ManyToOne
@ForeignKey(name = "user_Id")
private User    user;

示例教程:- Hibernate One To Many Annotation Tutorial

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2015-01-28
    • 2014-07-25
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多