假设我的应用程序中使用了字典(即性别:男性,女性)。
我希望将此词典用作Java enum
。此外,这个词典值是从一堆其他表中引用的,所以你希望它有一个单独的表。
Java enum
本身不能是实体。我可以在我的Entity类中使用enum
属性(注释为@Enumerated
)但这将在每个表中保存枚举(作为Integer,char或String)这个enum
而不是使用FK到字典表。
您如何实施此类用例?
- 使用静态方法创建Dictionary
实体,生成enum
值?
- 修改了Dictionary
的getter和setter,它返回enum
而不是Dictionary
个实例?
- 或者你可能永远不需要将enum
留在一个单独的表中?
答案 0 :(得分:0)
您可以使用与enum
的序号相匹配的整数ID值来定义词典表。正如许多人所指出的那样,这很脆弱,因为您无法轻松修改您的值:在ordinal()
注释上使用EnumType.ORDINAL
修饰符时,JPA依赖于@Enumerated
方法。
在边缘方面,您可以指定EnumType.STRING
,并将字典表的主键列定义为VARCHAR
,其值等于enum
的值名称。这仍然很脆弱,因为您无法再更改enum
名称。
answer for this question显示另一个选项:在您的实体中使用整数,但在您的访问者中进行翻译。
答案 1 :(得分:0)
这可以通过这种方法实现。
<强> 1。您可以存储ID的枚举
// ==UserScript==
// @name Check before Click
// @namespace CheckbeforeClick
// @include *
// @version 1
// @grant none
// ==/UserScript==
function iClicked(event) {
var link = event.target;
//go up the family tree until A tag
while (link && link.tagName != 'A') {
link = link.parentNode;
}
if (!link) return true;
var url = link.href;
var ajaxurl = link.getAttribute('href');
//change the following to apply on other links, maybe regex
var needToCheck = url.indexOf('speed') != -1;
//check if the url has the string 'speed' in it
if (!needToCheck) return true;
var reader = new XMLHttpRequest();
//asynchronous is true
reader.open('get', ajaxurl, true);
//check each time the ready state changes
//to see if the object is ready
reader.onreadystatechange = checkReadyState;
function checkReadyState() {
if (reader.readyState === 4) {
//check to see whether request for the file failed or succeeded
if ((reader.status == 200) || (reader.status === 0)) {
//page exists - redirect to the clicked url
document.location.href = url;
// or
// window.open(url)
} else {
//if the url does not exist
alert("No use going there!");
}
}
}
reader.send(null);
return false;
}
//intercept link clicks
document.onclick = iClicked;
<强> 2。与此枚举相关的单独实体
public enum Gender{
MALE(1L),
FEMALE(2L);
private final Long id;
Gender(Long id) {
this.id= id;
}
public Long getId(){
return id;
}
第3。查看EntityManager#findById
public class RefGenderEntity {
private Long id;
private String value;
......
}
当然,RefGenderEntity表现在可以预先填充两个值,您可以使用外键和常规正常工作连接。