Spring 休眠多对一外键注释映射
我在Spring3.1中使用Hibernate4,并且我对从这个映射生成的外键约束有一个问题Spring 休眠多对一外键注释映射,spring,hibernate,mapping,hibernate-mapping,hibernate-annotations,Spring,Hibernate,Mapping,Hibernate Mapping,Hibernate Annotations,我在Spring3.1中使用Hibernate4,并且我对从这个映射生成的外键约束有一个问题 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class O { private String oid; @Id @GeneratedValue(generator = "OidGenerator") @GenericGenerator(name = "O
@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
}
Assignment.owner_oid上的两个约束不应存在。由于任务分配,我无法保存角色/用户。我曾考虑过使用联接表的其他解决方案,但我看起来太过急躁。Join表看起来像
create table Role_Assignment (
role_oid varchar(36) ...
assignment_oid varchar(36) ...
assignment_id bigint ...
primary key (....)
);
但是我有assignment.owner_oid,用@MapsId注释,因此在这个连接表中,前两个列总是相同的。此外,我还有几个从O.class扩展而来的类,这意味着许多联接表。如何禁用分配表上的FK约束?您应该移动
...
public Set<Assignment> getAssignments() {
return assignments;
}
对于抽象类来说,这两个类都是相同的
为了回答您的问题,在您这样做之后,您可以将您的InheritanceType更改为JOINED或SINGLE\u TABLE,但您说您还有许多其他子类,因此这是不合适的,那么您将只有一个具有owner\u oid列的表可以从分配中引用。我无法移动getAssignments方法。但正如您所说,我将把InheritanceType更改为JOINED,在getAssignments方法中,我将使用@ForeignKeynone注释禁用用户和角色上的FK约束。因此,hibernate将只生成一个引用O的FK约束,这对我来说是可以的。为什么不能移动getAssignments?也许你们可以只为用户和角色创建超级类?类的层次结构是固定的,我不能改变它会破坏其他东西。我只需要坚持它…不知怎么的:但我修复了hibernate生成的FK。谢谢你的想法。
...
public Set<Assignment> getAssignments() {
return assignments;
}