如何使用单表策略创建外键

时间:2016-05-27 09:36:40

标签: hibernate jpa spring-data spring-data-jpa

我有两个实体UserPartnerPartner实体扩展了User

我正在使用单表策略,所以在数据库中User是唯一要创建的表。

我有另一个Doc实体,此实体与ManyToOne实体有Partner关系。

所以我想在午餐时我的应用程序在数据库UserDoc中创建两个表,表Doc将有一个外键引用{{{ 1}}表,但它没有这样做,相反它只创建一个列但没有引用键。

文档

User

Partenaire

@Entity
public class Doc implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String path;
    @Column(name="CREATION_TS", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable=false, updatable=false)
    private Calendar dateUploaded;

    @ManyToOne
    private Partenaire partenaire;

    public Doc(Document type, String name, String path, Calendar dateUploaded) {
        this.type = type;
        this.name = name;
        this.path = path;
        this.dateUploaded = dateUploaded;
    }

    //setters/getters

    @JsonIgnore
    @XmlTransient
    public Partenaire getPartenaire() {
        return partenaire;
    }

    @JsonSetter
    public void setPartenaire(Partenaire partenaire) {
        this.partenaire = partenaire;
    }
}

用户

@Entity
@DiscriminatorValue("UP")
@XmlType(name = "UP")
public class Partenaire extends User implements Serializable {

//properties

@OneToMany(mappedBy="partenaire")
    private Collection<Doc> docs;

public Collection<Doc> getDocs() {
        return docs;
    }

    public void setDocs(Collection<Doc> docs) {
        this.docs = docs;
    }

}

我该如何解决这个问题?

编辑:

这是我的表结构:

@Entity
@Table(name="users")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="TYPE_USER",discriminatorType=DiscriminatorType.STRING,length=2)

@XmlSeeAlso({Candidat.class, Partenaire.class})
public class User implements Serializable {
@Id
private String username;
//properties ... 

}

1 个答案:

答案 0 :(得分:0)

由于创建了一个sepparate partenaire-class并将其注释为@Entity,它将创建一个新表“Partenaire”,除非您将该表分别命名。我认为这不是你的意图,因为你已经有一个表“User”。 我想你要做的是将你的用户称为“Doc”类的一部分:

@ManyToOne
private User partenaire;

和(在用户级中):

@OneToMany(mappedBy="partenaire")
private Collection<Doc> docs;

如果您在控制器中正确实现了这一点,我认为您的问题将会得到解决。 当然,除非有另一个理由为partenaire制作一个sepparate类?