我在使用Hibernate时遇到问题,并在插入时强制执行唯一数据成员。
以下是我删节的实体对象:
工作流:
@Entity
public class Workflow {
private long wfId;
private Set<Service> services;
/** Getter/Setter for wfId */
...
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "workflow_services",
joinColumns = @JoinColumn(name = "workflow_id"),
inverseJoinColumns = @JoinColumn(name = "service_id"))
public Set<Service> getServices() {
return services;
}
服务:
@Entity
public class Service {
private long serviceId;
private String serviceName;
/** Getter/Setter for serviceId */
...
@Column(unique=true,nullable=false)
public String getServiceName() {
return serviceName;
}
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "service_operations",
joinColumns = { @JoinColumn(name = "serviceId") },
inverseJoinColumns = { @JoinColumn(name = "operationId") })
public Set<Operation> getOperations() {
return operations;
}
操作:
@Entity
public class Operation {
private long operationId;
private String operationName;
/** Getter/Setter for operationId */
@Column(unique=true,nullable=false)
public String getOperationName() {
return operationName;
}
我的问题:
虽然我已经在每个对象中声明了什么是独特的,但它没有被强制执行。
在我的Workflow对象中,我维护了一组服务。每个服务都维护一个操作列表。当工作流保存到数据库时,我需要它来检查它当前使用的服务和操作是否已经在数据库中,如果是,则将它自己与这些行关联。
目前,我正在服务和运营表格中重复这些内容。
我尝试过使用注释: @Table(uniqueConstraints)
但是运气不好。
非常感谢任何帮助
答案 0 :(得分:0)
unique或uniqueConstraints属性不用于强制DB中的唯一性,但如果从hibernate生成它,则创建正确的DDL(对于文档也是如此,但这是有争议的)。
如果你在hibernate中声明某些东西是唯一的,你应该在DB中通过添加约束来声明它。
将这种情况发挥到极致,您可以创建一个映射,其中PK在数据库中不是唯一的,并且当hibernate尝试通过调用Session.load来加载一个项目时会抛出异常,并且热情地发现它有2项。
答案 1 :(得分:0)
在我的Workflow对象中,我维护了一组服务。每个服务都维护一个操作列表。当工作流保存到数据库时,我需要它来检查它当前使用的服务和操作是否已经在数据库中,如果是,则将它自己与这些行关联。
我认为你要求Hibernate在将它们添加到Set时检测重复的对象,是吗?换句话说,当你在Set中放置一个对象时,你希望Hibernate去寻找该对象的持久版本并使用它。但是,这不是Hibernate的工作方式。如果您希望它“重用”一个对象,您必须自己查找然后再使用它。 Hibernate没有这样做。
我建议在类似DAO的对象上使用辅助方法来获取父对象和子对象,然后为你进行查找和设置。