非主キー列のONETOONEの関係
-
21-12-2019 - |
質問
他のものとのoneetoone関係を持つエンティティを照会するときに問題があります。これはシナリオです:
データベーステーブル:
create table people (
id decimal(10,0) NOT NULL,
email varchar(512) NOT NULL
);
create table users (
email varchar(512) NOT NULL
);
.
テストデータ:
insert into users (email) values ('jhon@domain.com');
insert into users (email) values ('mary@domain.com');
insert into people (id, email) values (1, 'jhon@domain.com');
insert into people (id, email) values (2, 'mary@domain.com');
.
エンティティ:
@Entity(name = "people")
public class Person implements Serializable {
@Column
@Id
private long id;
@Column
private String email;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Entity(name = "tbl_users")
public class User implements Serializable {
@Id
private String email;
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "email", referencedColumnName = "email")
private Person person;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
.
呼び出し:
...
User user = entityManager.find(User.class, "jhon@domain.com");
...
.
呼び出しの後、Hibernateのログに表示されます。
select user1_.email as email2_0_, person2_.id as id1_1_, person2_.email as email1_1_
from users user1_ left outer join people person2_ on user1_.email=person2_.id
where user1_.email=?
.
あなたが見ることができるように、users.idとeverse.id( user1_.email= person2_.id )を比較しているため、結合は間違っています( user1_.email= person2_.id )、 user 対応する人。
どのように修正することができるのか?
たくさんありがとう!!
解決
あなたはあなたのDataModelを再考するべきだと思います。ユーザーと人の間の関係は、継承の1つに見えます。
あなたのマッピングの問題は彼らがある程度の詐欺のためにここに見えます:
他のヒント
厳密に言えば、 JPA仕様は非主キー列への参照を許可しないでください。それはいくつかのJPA実装で機能するかもしれませんが、それは適切ではありません。
しかし、私はあなたが関係を双方向にすることによってこれを行うことができると思います。
@Entity
public class Person {
@Id
private long id;
@OneToOne
@JoinColumn(name = "email")
private User user;
public String getEmail() {
return user.getEmail();
}
public void setEmail(String email) {
// left as an exercise for the reader
}
}
@Entity
public class User {
@Id
private String email;
@OneToOne(mappedBy = "user")
private Person person;
}
.
実際に試してみて、警告ハッカー。
所属していません StackOverflow