我怎样才能做到这一点?
public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试的所有东西总是返回类型Object
而不是使用的特定类型.
有这样的事情:
public enum Token
{
FOO("foo", "f"),
QUIT("quit", "q"),
UNKNOWN("", "");
...
public parse(String s) {
for (Token token : values()) {
...
return token;
}
return UNKNOWN;
}
}
Run Code Online (Sandbox Code Playgroud)
抽象类:
abstract class Base
{
private boolean run;
Base() {
run = true;
while (run) {
inp = getInput();
act(inp);
}
}
public boolean act(String s) {
boolean OK = true;
switch (Token.parse(inp)) { /* Enum */
case FOO:
do_foo();
break;
case QUIT:
run = false;
break;
case UNKNOWN:
print …
Run Code Online (Sandbox Code Playgroud) 我们试图找出一种使用JPA持久存储枚举的强大方法.使用的常用方法@Enumerated
是不可取的,因为在重构时很容易破坏映射.每个枚举应该有一个单独的数据库值,可以与枚举名称/顺序不同,这样您就可以安全地更改枚举的名称或内部排序(例如序数值)而不会破坏任何内容.例如,这篇博文有一个如何实现这一目标的例子,但我们认为建议的解决方案会给代码增加太多的混乱.我们希望通过使用AttributeConverter
JPA 2.1中引入的新机制来实现类似的结果.我们有一个接口,每个枚举应该实现,它定义了一个方法,用于获取用于在数据库中存储枚举的值.例:
public interface PersistableEnum {
String getDatabaseValue();
}
...
public enum SomeEnum implements PersistableEnum {
FOO("foo"), BAR("bar");
private String databaseValue;
private SomeEnum(String databaseValue) {
this.databaseValue = databaseValue;
}
public void getDatabaseValue() {
return databaseValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我们还有一个基本转换器,它具有将枚举转换为字符串的逻辑,反之亦然,并为每个枚举类型分离具体的转换器类(AFAIK,一个完全通用的枚举转换器是不可能实现的,这也在本SO答案中注明).然后,具体转换器只需调用执行转换的基类,如下所示:
public abstract class EnumConverter<E extends PersistableEnum> {
protected String toDatabaseValue(E value) {
// Do the conversion...
}
protected E toEntityAttribute(Class<E> enumClass, String value) {
// Do the conversion...
}
}
...
@Converter(autoApply = true) …
Run Code Online (Sandbox Code Playgroud) 如何为泛型实现AttributeConverter?
就像是
class JSONConverter<T> implements AtttributeConverter<T,String>{
//Here How do I get the generic class type with which I can convert a serialized object
}
Run Code Online (Sandbox Code Playgroud)
在实体类中调用转换器作为
@Column
@Convert( converter = JSONConverter.class) //How do I pass the Generic here
private SomeClass sm;
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Hibernate 实现枚举映射。到目前为止,我已经研究了可用的选项,并且@Enumerated(EnumType.ORDINAL)
和似乎都@Enumerated(EnumType.STRING)
不足以满足我的需求。这@Enumerated(EnumType.ORDINAL)
似乎很容易出错,因为仅仅对枚举常量进行重新排序就会搞乱映射,而且这也@Enumerated(EnumType.STRING)
不够,因为我使用的数据库已经充满了要映射的值,而这些值并不是什么我希望我的枚举常量被命名为(值是外语字符串/整数)。
目前,所有这些值都被映射到字符串/整数属性。同时,属性应该只允许有限的值集(想象一下meetingStatus
属性允许字符串:PLANNED
、CANCELED
和DONE
。或者另一个属性允许有限的整数值集:1
、2
、3
、4
、5
)。
我的想法是用枚举替换实现以提高代码的类型安全性。String / Integer 实现可能导致错误的一个很好的例子是表示此类值的 String 方法参数 - 使用 String 时,任何内容都会发生。另一方面,拥有 Enum 参数类型会引入编译时安全性。
似乎满足我需求的唯一解决方案是为每个枚举实现javax.persistence.AttributeConverter
带有@Converter
注释的自定义。由于我的模型需要相当多的枚举,因此为每个枚举编写自定义转换器很快就开始变得疯狂。因此,我寻找问题的通用解决方案 - >如何为任何类型的枚举编写通用转换器。以下答案在这里有很大帮助: https: //stackoverflow.com/a/23564597/7024402。答案中的代码示例提供了某种通用的实现,但对于每个枚举,仍然需要一个单独的转换器类。答案的作者还继续说道:
“另一种方法是定义一个自定义注释,修补 JPA 提供程序以识别该注释。这样,您可以在构建映射信息时检查字段类型,并将必要的枚举类型提供给纯通用转换器。”
这就是我认为我会感兴趣的。不幸的是,我找不到更多关于此的信息,并且我需要更多的指导来了解需要做什么以及它如何与这种方法一起工作。
public interface PersistableEnum<T> {
T getValue();
}
Run Code Online (Sandbox Code Playgroud)
public enum IntegerEnum implements PersistableEnum<Integer> {
ONE(1),
TWO(2),
THREE(3),
FOUR(4),
FIVE(5),
SIX(6);
private int …
Run Code Online (Sandbox Code Playgroud) 说我有一个枚举:
public enum NotificationType {
Store("S"),
Employee("E"),
Department("D"),
All("A");
public String value;
NotificationType(String value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在数据库中存储S
orE
而不是Store
or Employee
。目前,我已将其映射到实体中,如下所示:
@Enumerated(EnumType.STRING)
private NotificationType notificationType;
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,不确定如何得到我想要的东西。