2017-03-02 57 views
1

我有一个JPA实体包含多对一引用到另一个表,该实体的简化版本如下:JPA /验证@ManyToOne关系不应该创建新行

@Entity 
@Table(name = "ENTITIES") 
public class Entity implements Serializable { 
    @Id @NotNull 
    private String id; 

    @JoinColumn(name = "REFERENCE", referencedColumnName = "ID") 
    @ManyToOne(optional = false) 
    private ReferencedEntity referencedEntity; 
} 

@Entity 
@Table(name = "REFERENCES") 
public class ReferencedEntity implements Serializable { 
    @Id @NotNull @Column(name = "ID") 
    private String id; 

    @Size(max = 50) @Column(name = "DSC") 
    private String description; 
} 

查找实体工作正常。有效的实体也可以正常工作,在我的特殊设置中有点太好了,我需要一些额外的验证。

问题
我的要求是,在表中的行参考是静态的,不应该被修改或新行补充说。
目前,当我创建一个新的实体实例与不存在的(还)ReferencedEntity和持久化实例,一个新的行被添加到参考

现在我已经在调用persist()之前在自己的validate()方法中实现了此检查,但我宁愿更优雅地执行此检查。
使用枚举而不是真正的实体不是一种选择,我想在未来几次不用重建/重新部署就自行添加行。

我的问题
什么是实现这样的检查的最佳方式?
是否有一些BV注释/约束可以帮助我限制这一点?也许是第三方图书馆?

+0

ü可以标记实体'@ immuteable'如果你这样做不想每次都改写,其余的取决于你的'persistence.xml'如何声明 – emotionlessbananas

+0

如果他使用的是Hibernate。 –

+0

不,我没有使用Hibernate。我使用EclipseLink作为JPA实现。 – Bossk

回答

1

这听起来像你需要先做一个数据库查询来检查值是否存在,然后插入记录。这必须在事务中完成,以确保查询结果在插入时仍然为真。我半年前遇到过类似问题,可能会为您提供一些关于如何设置锁定的线索。 Please see this SO question.

+0

是的,这似乎是我唯一的解决方案。我想知道如果我可以把它放在一个自定义验证器中,但.. – Bossk

0

你应该添加此=>插入= false时,可更新=假

,并删除=>可选=假的,也许尝试可为空=真

相关问题