我正在寻找使用JPA映射枚举的不同方法.我特别想设置每个枚举条目的整数值并仅保存整数值.
@Entity
@Table(name = "AUTHORITY_")
public class Authority implements Serializable {
public enum Right {
READ(100), WRITE(200), EDITOR (300);
private int value;
Right(int value) { this.value = value; }
public int getValue() { return value; }
};
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "AUTHORITY_ID")
private Long id;
// the enum to map :
private Right right;
}
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方案是使用EnumType注释和EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,JPA映射枚举索引(0,1,2)而不是我想要的值(100,200,300).
我找到的两个解决方案似乎并不简单......
这里提出的解决方案使用@PrePersist和@PostLoad将枚举转换为其他字段并将枚举字段标记为瞬态:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = …
Run Code Online (Sandbox Code Playgroud) 我有一个使用enum
类型的表列.我希望更新该enum
类型以获得额外的可能值.我不想删除任何现有值,只需添加新值.最简单的方法是什么?
我使用枚举来制作一些常量:
enum ids {OPEN, CLOSE};
Run Code Online (Sandbox Code Playgroud)
OPEN值为零,但我希望它为100.是否可能?
如何确定Swift枚举中的个案数?
(我想避免手动枚举所有值,或者尽可能使用旧的" enum_count技巧 ".)
我多年没有写过任何C++,现在我想回到它.然后我跑过去想着放弃:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
Run Code Online (Sandbox Code Playgroud)
这是什么?为什么typedef
这里使用关键字?为什么名称TokenType
在此声明中出现两次?语义与此有何不同:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
Run Code Online (Sandbox Code Playgroud) 我已经用Java编程了一段时间,只是投入了一个完全用C#编写的项目.我正试图加快C#的速度,并注意到在我的新项目中几个地方使用的枚举,但乍一看,C#的枚举似乎比Java 1.5+实现更简单.任何人都可以枚举C#和Java枚举之间的差异,以及如何克服这些差异?(我不想开始语言火焰战,我只想知道如何在C#中做一些我以前用Java做的事情).例如,有人可以发布一个C#对应的Sun着名的Planet枚举示例吗?
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7),
PLUTO (1.27e+22, 1.137e6);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2) …
Run Code Online (Sandbox Code Playgroud) 我有一个使用枚举的类,枚举当前在它自己的文件中,这看起来很浪费.
将枚举放在文件命名空间中的一般意见是什么?或者枚举真的应该存在于自己的cs文件中吗?
编辑
我应该提一下,虽然有问题的类使用这些枚举,但外部调用者也是如此.换句话说,另一个类可以设置这些枚举.因此,他们不会在课堂内部使用,否则这个问题将毫无疑问.
我有一个枚举
string name;
public enum Color
{
Red,
Green,
Yellow
}
Run Code Online (Sandbox Code Playgroud)
如何在加载时将其设置为NULL.
name = "";
Color color = null; //error
Run Code Online (Sandbox Code Playgroud)
编辑:我的不好,我没有正确解释.但所有与可空的相关的答案都是完美的.我的情况是如果,我已经在类中使用其他元素(例如名称等)获取/设置枚举.在页面加载时,我初始化类并尝试将值默认为null.这是场景(代码在C#中):
namespace Testing
{
public enum ValidColors
{
Red,
Green,
Yellow
}
public class EnumTest
{
private string name;
private ValidColors myColor;
public string Name
{
get { return name; }
set { name = value; }
}
public ValidColors MyColor
{
get { return myColor; }
set { myColor = value; }
}
}
public partial class _Default : …
Run Code Online (Sandbox Code Playgroud) 将enum
s作为标志处理可以在C#中通过[Flags]
属性很好地工作,但是在C++中执行此操作的最佳方法是什么?
例如,我想写:
enum AnimalFlags
{
HasClaws = 1,
CanFly =2,
EatsFish = 4,
Endangered = 8
};
seahawk.flags = CanFly | EatsFish | Endangered;
Run Code Online (Sandbox Code Playgroud)
但是,我收到关于int
/ enum
转换的编译器错误.是否有更好的表达方式而不仅仅是直接的铸造?优选地,我不想依赖来自第三方库的构造,例如boost或Qt.
编辑:如答案中所示,我可以通过声明seahawk.flags
为避免编译器错误int
.但是,我想有一些机制来强制执行类型安全,所以有人不能写seahawk.flags = HasMaximizeButton
.