3

Hibernate4.1.9で好きな方法で外部キーをモデル化する際に問題が発生します。

私は基本的に次のコードを持っています:

@Entity
@XmlRootElement
@Table(name="User")
public class UserVO
{
    private String email;

    @Id
    @Column(name="email", unique=true, nullable=false)
    @XmlElement
    public String getEmail()
    {
        return this.email;
    }
}

この:

@Entity
@XmlRootElement
@Table(name="Authentification")
public class AuthentificationVO
{
    private String email;
    private UserVO user;

    @Id 
    @Column(name="email", unique=true, nullable=false)
    @XmlElement
    public String getEmail()
    {
        return this.email;
    }

    @OneToOne(cascade = CascadeType.ALL)
    @ForeignKey(name="user_fk")
    public UserVO getUser()
    {
        return this.user;
    }
}

すべてのポイントは、両方のテーブルにemailという名前の列があることです。これは、UserテーブルとAuthentificationテーブルの両方の主キーとしても機能する必要があります。何らかの理由で、これを実行すると、Hibernateはuser_emailという名前の列をAuthentificationテーブルに追加するように要求しますが、emailという名前の既存の列を使用するようにします。

私はこれに対する解決策を探してみましたが、JoinColumnと一緒にmappedByアノテーションを使用して正しく処理しようとしましたが、何もうまくいかないようです。

4

2 に答える 2

2

最終的に実際にトリックを行ったのは、次の注釈を追加することでした。

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="email")
@MapsId

テーブルの作成時に無視されたため、ForeignKeyアノテーションを削除しました。唯一の効果は、制約の命名です。これは、休止状態によって自動生成されるようになり、私はそれを使用できます。

于 2013-03-09T08:23:02.877 に答える
1

@JoinColumn(name="user_fk")1対1の場合は、マッピングを指定する必要があります。アノテーションは、@ForeignKeyhibernateによって生成された外部キーの名前をオーバーライドするためだけにあり、使用する列をhibernateに指示するためではありません(これはの役割です@JoinColumn

[コメント後に編集]

実際、主キーにマッピングしているので、アノテーションを使用して、関連付けられたエンティティ@MapsIdのIDにマッピングしていることを休止状態に通知する必要があります。OneToOneマッピングは次のようになります。

@OneToOne(CascadeType.ALL)
@ForeignKey(name="email")
@MapsId
于 2013-03-08T20:26:43.653 に答える