【问题标题】:Beginners: Error in defining JPA one to one Mapping初学者:定义 JPA 一对一映射时出错
【发布时间】:2012-05-30 05:34:10
【问题描述】:

我有以下表格:

Login -> (id, username, password)
Members -> (member_id, name, address)

id和member_id是一一对应的。

我写了两个模型

登录模式:

@Entity
@Table(name = "Login", uniqueConstraints = { @UniqueConstraint(columnNames = "username") })
public class Login {

private int id;
private String username;
private String password;
private Members members;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public int getId() {
    return id;
}

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "id", referencedColumnName = "member_id")
public Members getMembers() {a
    return members;
}

}

会员模型:

@Entity
@Table(name = "Members")
public class Members {
private int member_id;
private String name;
private String address;

@Id
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name = "property", value = "Login") })
@Column(name = "member_id")
public int getMember_id() {
    return member_id;
}

private Login login;

@OneToOne(fetch = FetchType.LAZY, optional = true, cascade = CascadeType.ALL)
public Login getLogin() {
    return login;
}

}

为简单起见,我删除了一些 getter 和 setter。无论如何,你能告诉我我哪里错了吗?在更改注释的值时,我遇到了诸如未找到映射、未知持久类等错误。

错误

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建类路径资源 [database/Hibernate.xml] 中定义的名称为“sessionFactory”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException: @OneToOne 或 @ManyToOne on org.sparsham.login.model.Login.members 引用了一个未知实体:org.sparsham.members.model.Members org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

【问题讨论】:

  • 为什么你的Members类中有Members类的属性?您应该在 Members 类中定义 Login 类的属性。
  • @WesleyVrancken 这是我做的一个愚蠢行为。我改变了那个。请看一看。现在我的错误是 org.sparsham.login.model.Login.members 上的 @OneToOne 或 @ManyToOne 引用了一个未知实体:org.sparsham.members.model.Members
  • 您是否在 hibernate.cfg.xml 或同等文件中配置了实体类?
  • @JensSchauder 正在使用 Spring。在这种情况下我应该怎么配置?早些时候没有映射我能够插入到登录表中。现在映射其显示错误后。
  • 仍然找不到您的 Members 类,这可能意味着您忘记了配置文件中的映射。仔细检查并在此处发布。

标签: java hibernate jpa


【解决方案1】:

希望这可以解决您的最后一个问题。试试这些改变。

登录模式:

@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = true)
@PrimaryKeyJoinColumn
public Members getMembers() {a
    return members;
}

会员模型:

@Id
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name =          "property", value = "login") })
@Column(name = "member_id")
public int getMember_id() {
    return member_id;
}

private Login login;

@OneToOne(fetch = FetchType.LAZY, optional = true, cascade = CascadeType.ALL, mappedBy="members")
@PrimaryKeyJoinColumn
public Login getLogin() {
    return login;
}

注意@GenericGenerator注解中的@Parameter部分,“login”可能区分大小写。

【讨论】:

  • 最后一个问题依然存在。插入登录(members_id,密码,用户名)值(?,?,?)。 mappedBy = "members" 值以 login 中的主键为前缀。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多