0

나는 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 제약 조건을 해제하는 방법?

답변

0

당신은 추상 클래스, 두 클래스에서 그 같은에

... 
public Set<Assignment> getAssignments() { 
    return assignments; 
} 

를 이동해야합니다.

당신의 질문에 답하기 위해 - 당신이 당신의 InheritanceType을 JOINED (또는 SINGLE_TABLE로 바꿀 수는 있지만, 다른 많은 하위 클래스가 있으므로 적절하지 않다고 말했을 때) - 그러면 owner_oid 컬럼을 가진 하나의 테이블 만 가질 것입니다. 할당에서 참조 할 수 있습니다.

+0

getAssignments() 메소드를 이동할 수 없습니다. 하지만 InheritanceType을 JOINED로 변경하고 getAssignments() 메소드에서 @ForeignKey ("none") 주석을 사용하여 사용자 및 역할에 대한 FK 제약 조건을 비활성화합니다. 그러므로 절전 모드는 O를 참조하는 하나의 FK 제약을 생성 할 것이다. – viliam

+0

왜 getAssignments()를 움직일 수 없습니까? 어쩌면 사용자와 역할에 대해서만 수퍼 클래스를 만들 수 있습니까? –

+0

클래스 계층 구조가 고정되어 있으므로 다른 요소가 손상 될 수 있습니다. 난 그냥 그것을 유지해야합니다 ... 어떻게 든 :)하지만 최대 절전 모드에 의해 생성 된 FK를 고정. 당신의 아이디어에 감사드립니다. – viliam