2016-08-09 15 views
1

私は、列を結合することで、entiryをdbに保存する方法について混乱しています。私は、フィールドpscUser(ここではヌル)せずにユーザーインスタンスを保存するが、私はデシベルで空CuratorUserIdの状況で終わる正しい値を持つ有効なCuratorUserIdがある場合、私は参加するエンティティを永続化する方法

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
@Entity 
@Table(name = "psc_users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User implements Serializable { 
    private static final long serialVersionUID = 8885916014620036457L; 

    @Id 
    private static final String SEQUENCE_NAME = "psc_users_user_id_seq"; 
    @Id 
    @GeneratedValue(generator = "UseExistingOrGenerateIdGenerator", 
      strategy = GenerationType.SEQUENCE) 
    @GenericGenerator(name = "UseExistingOrGenerateIdGenerator", 
      strategy = "com.psc.util.UseExistingOrGenerateIdGenerator", 
      parameters = { 
        @org.hibernate.annotations.Parameter(name = "sequence", value = SEQUENCE_NAME) 
      } 
    ) 
    @Column(name = "USER_ID") 
    private Long userId; 

    @Column(name = "DEF", length = 30) 
    private String def; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "DEL_DATE") 
    private Date delDate; 

    @Column(name = "DISPLAY_DEF", length = 60) 
    private String displayDef; 

    @Column(name = "EMAIL", length = 60) 
    private String email; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "NAVI_DATE") 
    private Date naviDate; 

    @Column(name = "NAVI_USER") 
    private String naviUser; 

    @Column(name = "PHONE", length = 30) 
    private String phone; 

    @Column(name = "PWD", length = 40) 
    private String pwd; 

    //bi-directional many-to-one association to Branch 
    @ManyToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "BRNC_BRNC_ID", nullable = false) 
    private Branch pscBranch; 

    public Long getBrncBrncId() { 
     return brncBrncId; 
    } 

    public void setBrncBrncId(Long brncBrncId) { 
     this.brncBrncId = brncBrncId; 
    } 

    @Column(name = "BRNC_BRNC_ID", insertable = false, updatable = false) 
    private Long brncBrncId; 
    //bi-directional many-to-one association to User 
    @ManyToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "CURATOR_USER_ID") 
    private User pscUser; 


    public Long getCuratorUserId() { 
     return curatorUserId; 
    } 

    public void setCuratorUserId(Long curatorUserId) { 
     this.curatorUserId = curatorUserId; 
    } 

    @Column(name = "CURATOR_USER_ID", insertable = false, updatable = false) 
    private Long curatorUserId; 

    public User() { 
    } 

    public Long getUserId() { 
     return this.userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    public String getDef() { 
     return this.def; 
    } 

    public void setDef(String def) { 
     this.def = def; 
    } 

    public Date getDelDate() { 
     return this.delDate; 
    } 

    public void setDelDate(Date delDate) { 
     this.delDate = delDate; 
    } 

    public String getDisplayDef() { 
     return this.displayDef; 
    } 

    public void setDisplayDef(String displayDef) { 
     this.displayDef = displayDef; 
    } 

    public String getEmail() { 
     return this.email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public Date getNaviDate() { 
     return this.naviDate; 
    } 

    public void setNaviDate(Date naviDate) { 
     this.naviDate = naviDate; 
    } 

    public String getNaviUser() { 
     return this.naviUser; 
    } 

    public void setNaviUser(String naviUser) { 
     this.naviUser = naviUser; 
    } 

    public String getPhone() { 
     return this.phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public String getPwd() { 
     return this.pwd; 
    } 

    public void setPwd(String pwd) { 
     this.pwd = pwd; 
    } 

    public Branch getPscBranch() { 
     return this.pscBranch; 
    } 

    public void setPscBranch(Branch pscBranch) { 
     this.pscBranch = pscBranch; 
    } 

    public User getPscUser() { 
     return this.pscUser; 
    } 

    public void setPscUser(User pscUser) { 
     this.pscUser = pscUser; 
    } 

} 

を怒鳴る@Entity持っています。コードを見ると、これらの結合されたフィールドが表示されます。

@ManyToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "CURATOR_USER_ID") 
    private User pscUser; 


    @Column(name = "CURATOR_USER_ID", insertable = false, updatable = false) 
    private Long curatorUserId; 

ユーザー

repositoryUser.save(user); 

に私は私のユーザーを保存した後、データベースに参照

enter image description here

このデバッガで見、これを保存するためのコード。私の愚かな質問には申し訳ありません

enter image description here

が、私は別の行動に出くわす、別の方法で振る舞う私のプロジェクトのコードがあります。クエリ上のオーバーヘッドのために実際の別のユーザー(キュレーター)を検索したくないです。

+0

を参照してください。そうすれば、ヌル参照を持つオブジェクトを永続化し、ヌル(ヌルFK列)を維持する必要があります。また、オブジェクトを取得すると、nullが取得されます(FK列はデータストア内でnullなので)。そして?! –

+0

私はオブジェクトを指定しなかったときに練習をしています(:id: – Alex

+0

)IDだけを持っていればオブジェクト関係はなく、JPAはオブジェクト関係のために設計されています –

答えて

1

curetorUserIdフィールドの@Columnアノテーションには、 というinsertable = falseとupdatable = falseという意味があります。値は挿入および更新中に無視されます。

これらのプロパティをtrueに変更することもできます(しかし、他の場所でアプリケーションを破壊する可能性があります)。あるいは、単にプロキシを作成し、実際にはEntityManager.getReferenceを使用してpscUserフィールドに入力してください。データベース。

+0

答えはありがたいですが、オブジェクトの参照が必要ですか?inseatable = falseおよびupdatable = falseの場合 – Alex

+0

有効なpscUserを指定していない場合は何が表示されますか(dbではなく、idがdbで構成されていますか?この属性を使って悪影響を与えることはありません – Alex

+0

ユーザークラスには、データベースの同じ列、すなわちpscUserとcuratorUserIdに接続されている2つのフィールドがあります。データベースからデータをフェッチする際に、両方のフィールドが休止状態で入力されます。 pscUserが使用され、curatorUserIdは無視されます。 – mateuszlo

1

あなたのマッピングは、以下のようになります。

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
@Entity 
@Table(name = "psc_users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User implements Serializable { 
    private static final long serialVersionUID = 8885916014620036457L; 

    @Id 
    private static final String SEQUENCE_NAME = "psc_users_user_id_seq"; 
    @Id 
    @GeneratedValue(generator = "UseExistingOrGenerateIdGenerator", 
      strategy = GenerationType.SEQUENCE) 
    @GenericGenerator(name = "UseExistingOrGenerateIdGenerator", 
      strategy = "com.psc.util.UseExistingOrGenerateIdGenerator", 
      parameters = { 
        @org.hibernate.annotations.Parameter(name = "sequence", value = SEQUENCE_NAME) 
      } 
    ) 
    @Column(name = "USER_ID") 
    private Long userId; 

    @Column(name = "DEF", length = 30) 
    private String def; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "DEL_DATE") 
    private Date delDate; 

    @Column(name = "DISPLAY_DEF", length = 60) 
    private String displayDef; 

    @Column(name = "EMAIL", length = 60) 
    private String email; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "NAVI_DATE") 
    private Date naviDate; 

    @Column(name = "NAVI_USER") 
    private String naviUser; 

    @Column(name = "PHONE", length = 30) 
    private String phone; 

    @Column(name = "PWD", length = 40) 
    private String pwd; 

    //bi-directional many-to-one association to Branch 
    @ManyToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "BRNC_BRNC_ID", nullable = false) 
    private Branch pscBranch; 

    //bi-directional many-to-one association to User 
    @ManyToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "CURATOR_USER_ID") 
    private User pscUser; 

    public User() { 

    } 
} 

あなたがオブジェクトの観点で考える必要があります。 pkUserリファレンスをユーザーのインスタンスに設定した場合にのみ、FKはデータベースに設定されます。これが既存のユーザーの場合は、既存の永続エンティティへの参照を設定する必要があります。

+0

しかし、curatorUserIdを設定するのに十分な場合、別の動作があります。しかし、pscUserはnullです。 – Alex

+0

これは、updateable/insertable falseに設定されているため、いいえです。 YouiはORMを使用しているので、オブジェクトの観点から考える。 –

+0

Okey、もし私がオブジェクトの面で考えると、inseartable = falseとupdateable = falseを削除すると。それはその行動を保つだろうか?私がCuratorUserIdとpscUser = nullだけを指定した場合 – Alex

関連する問題