Hibernate注解和外键关系

7

我有一个领域对象,为了支持Hibernate,它被注释如下。

@Entity
@Table(name = "INPUT")
public class AppInput {

  /**
   * Unique id for this request
   */
  @Id
  @GeneratedValue
  @Column(name = "INPUT_ID")
  private long requestId;
  /**
   * 
   */
  @Column(name = "EMAIL_ID")
  private String emailId;
  /**
   * 
   */
  @Column(name = "REQUEST_DATE")
      private Date requestDate;
  /**
    * 
   */
  @Column(name = "INPUT_STATUS")
   private char status;
  /**
   * 
   */
   @Column(name = "EXPECTED_ORDER_DATE")
  private Date expectedOrdDt;

//Getter and setters
   }

属性emailId是一个外键,指向User表中的emailId列。假设我在AppInput.java中添加了一个属性,如下所示:private User userDetails; 我该如何注释这个属性,以便在从数据库获取AppInput时,对应的用户详细信息也被填充?
1个回答

21

属性emailId是一个外键,指向用户表中的emailId列。

那就不要添加emailId属性,而是添加一个User

(...) 我该如何注解,以便每当我从数据库中获取AppInput时,相应的用户详情也会被填充?

不确定,因为它可能是ManyToOneOneToOne,但我假设它是ManyToOne

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="USERDETAILS_EMAIL_ID", referencedColumnName="EMAIL_ID")
private User userDetails;
fetch 注解元素只用于演示目的,实际上 EAGER 是默认值。在 JoinColumn 中,namereferencedColumn 注解元素也是可选的。以下是 JPA 规范中的简要摘要:

11.1.21 JoinColumn Annotation

JoinColumn 注解用于指定用于连接实体关联或元素集合的列。

表20列出了可能为 JoinColumn 注解指定的注解元素及其默认值。

如果默认使用 JoinColumn 注解自己,则假定有一个单独的连接列,并且适用于表20中描述的默认值。

name 注解元素定义外键列的名称。其余的注解元素(除了 referencedColumnName)都引用此列,并且具有与 Column 注解相同的语义。

如果缺少 referencedColumnName 元素,则假定外键引用的是所引用表的主键。

请参见规范中的表20以获取完整详尽的细节。


是的,它是多对一。我尝试了这段代码,但它显示“fetch”不是一个有效的属性。我尝试将其删除,但它显示“MappingException.Could not determine type for a.b.c.User”。 - user378101
1
@user378101:小错误,fetchManyToOne的注释元素。关于第二个错误,似乎User不是一个实体(您需要使用@Entity进行注释,并在persistence.xml中声明它)。只有实体可以用于关联。 - Pascal Thivent
我怀疑这一点,但是User类已经用@Entity进行了注释。 - user378101
@user378101:你能展示一下 User 类吗?你确定在应用程序启动时没有收到任何错误消息(可能会防止将 User 正确映射)吗? - Pascal Thivent
谢谢,现在它可以工作了。我已经注释了getUser方法。尝试注释字段,它也可以工作。这有什么区别? - user378101
@user378101:请参考https://dev59.com/2HA75IYBdhLWcg3wdIv7 - Pascal Thivent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接