質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

エラー does not exist

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,903

score 58

Profile.java

//profileテーブルとマッピングさせる

package com.example.konkatsu.domain;

import java.sql.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor    //デフォルトコンストラクタも必要な場合
@AllArgsConstructor   //すべてのフィールドを引数に持つコンストラクタを自動生成
@Entity    //エンティティ(一単位として扱われるデータのまとまり)であることを示す。指定したクラス名がテーブルとマッピングされる
@Table(name = "profile")  //接続するテーブルを指定
//@ToString(exclude = "users")   //Userクラスには対応するProfileクラスのフィールドを追加
public class Profile {
    @Id   //主キー
    @GeneratedValue   //自動採番される
    private Integer id;
    private Integer genderId;
    private String name;
    private Date birthday;
    private Integer height;
    private Integer occupationId;
    private Integer income;
    private String text;
    private byte[] image;
    @ManyToOne(fetch = FetchType.LAZY)             //@ManyToOneで多対1の関係にする
    @JoinColumn(nullable = true, name = "user_id")   //外部キーのカラム名の指定
    private User user;
}

User.java

package com.example.konkatsu.domain;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data  //getterメソッド・setterメソッドをコード上に直接書かなくて済む
@NoArgsConstructor
@AllArgsConstructor
@Entity  //JPAに管理してもらう
@Table(name = "users")  //接続するテーブルを指定
@ToString(exclude = "profile")
public class User {

    @Id  //変数idをプライマリーキーに指定
    @GeneratedValue   //自動採番される
    private Integer userId;
    private String mail;
    private String pass;
    @OneToMany(fetch = FetchType.EAGER, cascade= CascadeType.ALL, mappedBy = "user" ) //Usersとprofileを1対多の関係にするため@OneToManyをつけるcascade = CascadeType.ALLを設定することでUserの操作をprofileにも伝播できる
    private List<Profile> profile;

}

Profileテーブル
イメージ説明

Usersテーブル
イメージ説明

イメージ説明

これで実行すると
コンパイルは問題なく通るのですが
http://localhostでアクセスすると

org.postgresql.util.PSQLException: ERROR: column profile0_.id does not exist

とidがありませんという様な
エラーが出てしまいます

マッピングのやり方が間違っていると思うのですが
どうしても解決できません

アドバイスがありましたらお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Profileのエンティティクラスで、主キー(@Id)のフィールドで「id」を持っていますが、
実テーブルにはidという列がないためです。

ちなみにProfileテーブルにおける主キーは何でしょうか?
もし、user_idにマッピングさせたい場合は、@Columnを使用します。
@Columnがない場合は、FW側で列名のキャメルケース型のフィールドにマッピングします。
そのため、それに該当しない場合は、明示的に列名を指定してあげる必要があります。

@Column(name="user_id")
@Id
private Integer id;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/05 13:54

    @JoinColumn(nullable = true, name = "user_id", insertable=false, updatable=false )
    とつけたら動きました!!

    これってどういう意味なのですか??

    キャンセル

  • 2017/07/05 14:16

    そこは自分で調べていただきたいですが、、、。
    簡単にいうと、「Profileの登録、または更新時にUserの登録、更新は行いませんよ。」という意味です。

    キャンセル

  • 2017/07/05 15:05

    いろいろとご丁寧にありがとうございました!!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る