用于添加和查看引用表中的值的JPA注释

时间:2011-11-28 00:20:59

标签: jpa jpa-2.0

说我有这个班:

@Entity
@Table(name="PICTURE")
public class Picture{
   private String category1, category2;
}

但数据库结构如下所示:

TABLE PICTURE {
   int category1;
   int category2;
   ...
}

TABLE PICTURE_REF {
   int category;
   String categoryName;
   ...
}

我如何在Picture上使用JPA注释,以便在我请求其实例时,category1category2包含来自PICTURE_REF表的categoryName而非存储在PICTURE表中的实际整数id?

我也想知道保存是如何工作的,因为用户会从下拉列表中选择一个类别,相应的类别整数ID将存储在PICTURE表中。

2 个答案:

答案 0 :(得分:2)

根据您的说明,PICTURE.category1PICTURE.category2PICTURE_REF具有多对一关系

以下显示了使用注释的双向映射:

表格PICTURE:

@Entity
@Table(name="PICTURE")
public Class Picture{

   @Id
   private Integer id;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "category1")
   private PictureRef category1, 

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "category2")
   private PictureRef category2;


   //getter and setters 

}

表格PICTURE_REF:

@Entity
@Table(name="PICTURE_REF")
public Class PictureRef{

   @Id
   private Integer id;

   @OneToMany(mappedBy = "category1")
   List <Picture> listOfCat1Picture= new ArrayList<Picture>();  

   @OneToMany(mappedBy = "category2")
   List <Picture> listOfCat2Picture= new ArrayList<Picture>(); 

   //getter and setters 

}

重点:

  • @Entity将java类标记为hibernate实体。它映射到@Table

  • 中指定的表的名称
  • 使用@ManyToOne定义多对一关系

    在关系数据库中,使用以下外键约束表示多对一关系: “许多边桌”有一个FK列,它只接受“单边桌”的PK。

    在您的情况下,这些FK列为PICTURE.category1PICTURE.category2name的{​​{1}}属性可以明确定义这些FK列的名称。

  • @JoinColumn会在FetchType.EAGER加载或获取

  • 时急切地提取PictureRef
  • 根据您的要求,您可以在Picture中省略unidirectional来执行@OneToMany映射。它也可以。但是,PictureRef,你无法访问其图片

  • 鉴于图片实例,您可以通过

    获取其categoryName和categoryId
    • picture.getCategory1()。getCategoryName()
    • picture.getCategory1()。getId()
    • picture.getCategory2()。getCategoryName()
    • picture.getCategory2()。getId()

答案 1 :(得分:2)

如果您无法修改架构

您可以修改映射,以便Category是一个实体而不仅仅是一个String。然后你会有一个OneToOne或(更有可能)从图片到类别1和类别2的ManyToOne。

如果您可以修改架构 您可以使用Picture上的ElementCollection来存储List而不是category1和category2。这会给你一个类似

的模式
TABLE PICTURE {
   long key;
}

TABLE PICTURE_CATEGORY {
    long picture_key;
    String category_name;
}

或者您可以再次将类别映射到实体并使用从图片到类别的ManyToMany,这将为您提供类似

的模式
TABLE PICTURE {
   long key;
   ...
}

TABLE PICTURE_CATEGORY {
    long picture_key;
    long category_key;
}

TABLE CATEGORY {
    long key;
    String name;
}

至于保存,您可以使用转换器,无论您的视图技术是什么,都可以从键转换为类别,或者您可以从控制器中的键加载类别,并在保存之前将其设置在图片中。我怀疑你是否想要将图片保存到类别中。