Hibernate ForeignKey映射注释

时间:2016-12-15 09:10:31

标签: java hibernate hibernate-mapping

我希望hibernate生成一些带外键的表,依此类推。我给你一个我希望hibernate生成的查询的例子:

create table RealtimeCost(id INTEGER not null primary key Autoincrement,
    mnemonic varchar(50)not null references Exchange(mnemonic),
    sid int not null references License(sid),
    price numeric(10,2) not null)

所以这个查询应该由hibernate通过Annotations生成。对应的类是:

@Entity
@Table
public class RealtimeCost {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @MapsId("mnemonic")
    @JoinColumn(referencedColumnName="sid")
    private String mnemonic;
    @MapsId("sid")
    @JoinColumn(referencedColumnName="sid")
    private Integer sid;
    @Column
    private Double price;

mnemonic RealtimeCost应该映射到的内容示例(RealtimeCost中的每个助记符在Exchange中只有1个值):

@Entity
@Table
public class Exchange {
    @Id
    @Column(name="mnemonic")
    private String exchange;
    @Column
    private String description;

正如您所看到的,我已经在文档的帮助下尝试了一下,但我无法通过hibernate生成外键。如果有人能告诉我这个课程所需的注释和价值,那将是非常友好的,所以我也可以自己为其他课程做。另请告诉我是否需要更改Exchange类中的任何内容才能使映射生效。提前致谢

4 个答案:

答案 0 :(得分:2)

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "accommodation_type", unique = true, nullable = false)
private AccommodationType accommodationType;

@ManyToOne()根据@JoinColumn()创建关系 name中的@JoinColumn()是您要建立连接的表名。

然后,当您创建一个将要连接到主类的类时,首先需要在@Entity下面给它一个表名,例如@Table(name="accommodation_types")

然后你创建你的变量。

//bi-directional many-to-one association to Accommodation
@OneToMany(mappedBy="accommodationType", fetch=FetchType.EAGER)
private List<Accommodation> accommodations;

mappedBy的值是主类中的变量名。

答案 1 :(得分:1)

我不是专家,但我们让hibernate使用javax.persistence注释来加入实体。

  @javax.persistence.ManyToOne( fetch = javax.persistence.FetchType.EAGER, optional = true )
  @javax.persistence.JoinColumn( name = "VIEWTYPE_ID", nullable = true, unique = false, insertable = true, updatable = true )
  private com.company.other.subproject.ViewType viewType;

也许这就是你所需要的。因为这让hibernate关心必须创建或不创建的表,并且使用您与之通信的数据库的方言自动创建foreignKeys。

答案 2 :(得分:1)

您应该在一个实体中设置关联,并在另一个实体中使用mappedBy。您不需要@MapsId因为您没有使用嵌入式实体(请阅读文档)。请查看@OneToMany@ManyToOne关系:

@Entity
@Table
public class RealtimeCost {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToMany
    @JoinColumn(name="mnemonic")
    private Exchange exchange;
    ...
}

@Entity
@Table
public class Exchange {
    @Id
    @Column(name="mnemonic")
    private String mnemonic;

    @Column
    private String description;

    @ManyToOne(mappedBy="exchange")
    private RealtimeCost realtimeCost;
    ...
}

答案 3 :(得分:1)

这里发布的每个答案都得到了我的支持,因为每个人都是对的,但这不是我所追求的100%,但它帮助我自己解决了我的问题。对于我发布的示例,我正在寻求的解决方案如下(我也添加了不可空):

@Entity
@Table
public class RealtimeCost {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @ManyToOne
    @JoinColumn(name = "mnemonic",nullable=false)
    private Exchange exchange;
    @ManyToOne
    @JoinColumn(name = "sid",nullable=false)
    private License license;
    @Column(nullable=false)
    private Double price;

这些是我为RealtimeCost课程寻找的注释。我在Exchange类中不需要任何特殊的注释。 @Nico回答最接近我的要求,因此他的回答将被接受