说我有这个班:
@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注释,以便在我请求其实例时,category1
和category2
包含来自PICTURE_REF表的categoryName
而非存储在PICTURE表中的实际整数id?
我也想知道保存是如何工作的,因为用户会从下拉列表中选择一个类别,相应的类别整数ID将存储在PICTURE表中。
答案 0 :(得分:2)
根据您的说明,PICTURE.category1
和PICTURE.category2
与PICTURE_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.category1
和PICTURE.category2
。 name
的{{1}}属性可以明确定义这些FK列的名称。
@JoinColumn
会在FetchType.EAGER
加载或获取
PictureRef
根据您的要求,您可以在Picture
中省略unidirectional
来执行@OneToMany
映射。它也可以。但是,PictureRef
,你无法访问其图片
鉴于图片实例,您可以通过
获取其categoryName和categoryId答案 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;
}
至于保存,您可以使用转换器,无论您的视图技术是什么,都可以从键转换为类别,或者您可以从控制器中的键加载类别,并在保存之前将其设置在图片中。我怀疑你是否想要将图片保存到类别中。