【发布时间】:2012-03-22 18:47:17
【问题描述】:
我将 Hibernate 4 与 Spring 3.1 一起使用,但我遇到了由该映射生成的外键约束的问题。
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class O {
private String oid;
@Id
@GeneratedValue(generator = "OidGenerator")
@GenericGenerator(name = "OidGenerator", strategy = "com.evolveum.midpoint.repo.sql.OidGenerator")
@Column(unique = true, nullable = false, updatable = false, length = 36)
public String getOid() {
return oid;
}
...other getters and setters
}
@Entity
public class Role extends O {
private Set<Assignment> assignments;
@OneToMany(mappedBy = "owner")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<Assignment> getAssignments() {
return assignments;
}
...other getters and setters
}
@Entity
public class User extends O {
private Set<Assignment> assignments;
@OneToMany(mappedBy = "owner")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
public Set<Assignment> getAssignments() {
return assignments;
}
...other getters and setters
}
@Entity
public class Assignment extends IdentifiableContainer {
private O owner;
private Long id;
@Id
@MapsId("oid")
@ManyToOne
public O getOwner() {
return owner;
}
@Id
@GeneratedValue(generator = "ContainerIdGenerator")
@GenericGenerator(name = "ContainerIdGenerator", strategy = "com.evolveum.midpoint.repo.sql.ContainerIdGenerator")
@Column(nullable = true, updatable = true)
public Long getId() {
return id;
}
...other getters and setters
}
这会产生这样的架构......
create table Assignment (
id bigint not null,
owner_oid varchar(36) not null,
primary key (owner_oid, id)
);
create table Role (
oid varchar(36) not null unique,
primary key (oid)
);
create table User (
oid varchar(36) not null unique,
primary key (oid)
);
alter table Assignment
add constraint FKB3FD62ED72781986
foreign key (owner_oid)
references User;
alter table Assignment
add constraint FKB3FD62ED7276AE31
foreign key (owner_oid)
references Role;
不应存在对 Assignment.owner_oid 的两个约束。由于它们,我无法保存具有分配的角色/用户。我考虑过使用连接表的其他解决方案,但我看起来太尴尬了。连接表看起来像
create table Role_Assignment (
role_oid varchar(36) ...
assignment_oid varchar(36) ...
assignment_id bigint ...
primary key (....)
);
但我的 assignment.owner_oid 用 @MapsId 注释,因此在这个连接表中,前两个列总是相同的。此外,我还有更多从 O.class 扩展的类,这意味着许多连接表。如何禁用分配表上的 FK 约束?
【问题讨论】:
标签: spring hibernate mapping hibernate-mapping hibernate-annotations