2016-12-15 9 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) 

:病気あなたに私が生成する冬眠するクエリの例を与えます。これに対応するクラスがある:あなたが私を見ることができるように

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

RealtimeCostmnemonicは(RealtimeCostの各ニーモニックはExchangeで正確に1の値を持つ)にマッピングされるべきもののため

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

例ドキュメントの助けを借りて少し試しましたが、私は外部キーを休止状態で生成させることができませんでした。誰かが私にこのクラスの必要な注釈と値を教えてもらえると本当に親切なので、他のクラスについても自分自身でそれを行うことができます。また、マッピングが機能するように、Exchangeクラス内の何かを変更する必要があるかどうか教えてください。事前に感謝します

答えて

1

私はエキスパートではありませんが、エンティティに参加するための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; 

おそらくこれが必要です。これは作成する必要があるかどうかを判断するために、外部キーが通信するデータベースの方言で自動的に作成されるようにするためです。

+0

これは、 'ViewType'型のオブジェクトを' ViewType'クラスのidだけにマップしますか? – Aelop

+0

ビュータイプのIDにどのように注釈を付けたか教えていただけますか? – Aelop

+0

遅れて申し訳ありません。はい、エンティティをID参照としてマッピングします。 FetchTypeを使用すると、ロードする方法をさらに指定できます。 (レイジーまたはエイジャー) ViewTypeにはこの '@AttributeOverride({@AttributeOverride(name =" id "、column = @Column(name =" VIEWTYPE_ID ")) }})アノテーションが付けられていますが、このアノテーションはクラス定義。エンティティを宣言する別の戦略を使用しているからです。しかし、id列には@Idというアノテーションが付けられています。 これは、fetchtype '@ javax.persistence.Basic(fetch = javax.persistence.FetchType.EAGER、optional = false)の例の注釈です。 ' – Nico

1

1つのエンティティで関連付けを設定し、もう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 "属性mappedByは、アノテーションタイプManyToOne'に対して未定義です – Aelop

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

@ManyToOne()@JoinColumn()@JoinColumn() nameに応じて関係を作成すると、接続をしたいテーブル名です。あなたがメインクラスに接続しようとしているクラスを作成するときに

その後、あなたはまず、あなたの変数を作成@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

すべての回答は私からupvoteを得ました。みんながちょっと正しいので、100%ではありませんでしたが、自分で自分の問題を解決するのに役立ちました。私が投稿たとえば、私が求めていたソリューションは、次の通りである(私はまた、NULL可能ではない追加):

@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の答えは私が必要とするものに最も近いので、彼の答えは受け入れられるでしょう。

関連する問題