在JPA 2中实现基于枚举的字典

时间:2011-11-18 16:39:06

标签: java dictionary enums jpa-2.0

假设我的应用程序中使用了字典(即性别:男性,女性)。

我希望将此词典用作Java enum。此外,这个词典值是从一堆其他表中引用的,所以你希望它有一个单独的表

Java enum本身不能是实体。我可以在我的Entity类中使用enum属性(注释为@Enumerated)但这将在每个表中保存枚举(作为Integer,char或String)这个enum而不是使用FK到字典表。

您如何实施此类用例?
- 使用静态方法创建Dictionary实体,生成enum值?
- 修改了Dictionary的getter和setter,它返回enum而不是Dictionary个实例?
- 或者你可能永远不需要将enum留在一个单独的表中?

2 个答案:

答案 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表现在可以预先填充两个值,您可以使用外键和常规正常工作连接。