나는 Hibernate 4를 Spring 3.1과 함께 사용하는데이 매핑으로부터 생성 된 외래 키 제약 조건에 문제가있다.하이버 네이트 many-to-one 외래 키 주석 매핑
@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 따라서 처음 두 colums 항상 같은 것이 가입 테이블에 @MapsId 주석 있습니다. 또한 많은 조인 테이블을 의미하는 O.class에서 확장되는 몇 개의 클래스가 있습니다. 할당 테이블에서 해당 FK 제약 조건을 해제하는 방법?
getAssignments() 메소드를 이동할 수 없습니다. 하지만 InheritanceType을 JOINED로 변경하고 getAssignments() 메소드에서 @ForeignKey ("none") 주석을 사용하여 사용자 및 역할에 대한 FK 제약 조건을 비활성화합니다. 그러므로 절전 모드는 O를 참조하는 하나의 FK 제약을 생성 할 것이다. – viliam
왜 getAssignments()를 움직일 수 없습니까? 어쩌면 사용자와 역할에 대해서만 수퍼 클래스를 만들 수 있습니까? –
클래스 계층 구조가 고정되어 있으므로 다른 요소가 손상 될 수 있습니다. 난 그냥 그것을 유지해야합니다 ... 어떻게 든 :)하지만 최대 절전 모드에 의해 생성 된 FK를 고정. 당신의 아이디어에 감사드립니다. – viliam