Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 休眠多对一外键注释映射_Spring_Hibernate_Mapping_Hibernate Mapping_Hibernate Annotations - Fatal编程技术网

Spring 休眠多对一外键注释映射

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

我在Spring3.1中使用Hibernate4,并且我对从这个映射生成的外键约束有一个问题

@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;
}