我想在不使用主键的情况下唯一地标识实体。所以我想到了生成一个独特的随机值。此外,值必须易于阅读/手动复制,预计长度为6或7个字符。
我的实体A:
public class A{
// ...
@Column(name="value", unique=true, nullable=false, insertable=false, updatable=false)
private String value;
// ...
public String getValue(){
return value;
}
protected void setValue(String value){
this.value = value;
}
}
由表格
表示在数据库中CREATE TABLE IF NOT EXISTS schema.mytable{
-- ...
value TEXT NOT NULL DEFAULT generate_unique_value_for_mytable(),
-- ...
CONSTRAINT "un_value" UNIQUE (value),
-- ...
}
我想让数据库处理这个,然后获取值...
使用当前设计,在数据库中正确生成值,但是当JPA获取A实体时, value 字段为空。
我无法找到证据,但看起来让数据库生成值是一个坏主意。对于由序列生成的非主键字段,我确实遇到了同样的问题:我无法从数据库中获取值。
所以我丑陋的解决方案是装饰负责A实体的EJB的 create()方法:
public class Aejb{
public void create(A entity){
// method kind of ensures randomness
String value = MyUtil.generateRandomValue();
A isThereAnyoneHere = findByValue(value);
while(isThereAnyoneHere != null){
String value = MyUtil.generateRandomValue();
isThereAnyoneHere = findByValue(value);
}
// unicity is ensured
entity.setValue(value);
em.persist(entity);
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
如果我理解正确,@ Generated注释应该可以解决问题。此批注设置数据库DEFAULT字段值的值。
示例:
@Generated(GenerationTime.INSERT)
@Column(name="value", unique=true, nullable=false, insertable=false, updatable=false)
private String value;
但是有一个缺点:如果您决定在Java中设置字段的值,那么Hibernate将使用数据库中的DEFAULT结果覆盖它。
答案 2 :(得分:0)
自我回答将问题标记为已关闭
我们终于选择了
的组合使用此配置,EJB肯定最多只有一个数据库调用来获取请求的值。
以下是自我参考和下一位读者的其他答案反馈摘要: