2016-12-15 309 views
0

我想休眠生成一些表與外鍵等。我給你我想Hibernate來生成查詢的一個例子:休眠ForeignKey映射註釋

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通過註解生成。對應的類是這樣的:

什麼在 RealtimeCostmnemonic應該映射到
@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; 

例子(RealtimeCost每個助記符在Exchange準確值爲1):

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

正如你可以看到我已經在文檔的幫助下嘗試了一下,但我無法通過休眠生成外鍵。如果有人能夠告訴我這個班級需要的註釋和價值,那真的很友善,所以我可以自己爲其他班級做這些。也請告訴我,如果我需要更改Exchange類中映射工作的任何內容。在此先感謝

回答

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會使用與之通信的數據庫的方言自動創建。

+0

這是否將類型'ViewType'的對象映射到類'ViewType'的id? – Aelop

+0

你能告訴我你是如何註釋viewtype ID嗎? – Aelop

+0

對不起,對了。是的,它將實體映射爲ID參考。使用FetchType,您可以進一步指定應該如何加載它。 (Lazy or Eager) ViewType用這個'@AttributeOverrides({@AttributeOverride(name =「id」,column = @Column(name =「VIEWTYPE_ID」)) }''註解,但是這個註解是在類定義。因爲我們使用另一種聲明實體的策略。但id列是用@Id註解的。 這是'@ javax.persistence.Basic(fetch = javax.persistence.FetchType.EAGER,optional = false)' – Nico

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; 
    ... 
} 
+0

這個'@ManyToOne(mappedBy =「exchange」)'導致錯誤的示例註釋me'註釋類型ManyToOne'沒有定義屬性mappedBy – Aelop

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

@ManyToOne()根據@JoinColumn() name@JoinColumn()創建一個關係就是你想連接的表名。

然後,當你創建一個要連接到主類的類,你首先需要給它一個表名下方@Entity e.g @Table(name="accommodation_types")

然後創建您的變量。

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

mappedBy的值是主類中的變量名。

1

發表在這裏的每個答案都得到了我的讚賞,因爲每個人都挺對,但這不是我正在尋找的100%,但它幫助我自己解決了我的問題。對於i張貼例如i正在尋求解決方案如下(我還添加不可爲空):

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

這些是:i擬出售RealtimeCost類註釋。我不需要Exchange類中的任何特殊註釋。@Nico答案與我所需要的最接近,因此他的答案將被接受