[英]Hibernate - one to one relation
我有兩張桌子
用戶
CREATE TABLE "user"
(
id INTEGER PRIMARY KEY NOT NULL,
phone TEXT,
position_id BIGINT,
CONSTRAINT user_position_id_fk FOREIGN KEY (position_id) REFERENCES position (id)
);
CREATE UNIQUE INDEX user_id_uindex ON "user" (id);
位置
CREATE TABLE position
(
id INTEGER PRIMARY KEY NOT NULL,
latitude DOUBLE PRECISION,
longitude DOUBLE PRECISION,
bearing DOUBLE PRECISION,
accuracy DOUBLE PRECISION,
speed DOUBLE PRECISION,
user_id BIGINT,
CONSTRAINT position_user_id_fk FOREIGN KEY (user_id) REFERENCES "user" (id)
);
CREATE UNIQUE INDEX position_id_uindex ON position (id);
它們通過如下注釋進行映射:
@Entity
@Table(name = "user")
public class User {
public static final String ID = "id";
public static final String PHONE = "phone";
public User() {
position = new Position();
}
@Id
@Column(name = ID, unique = true)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = PHONE)
private String phone;
@OneToOne(mappedBy = "user")
@Cascade(CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "position_id")
private Position position;
}
@Entity
@Table(name = "position")
public class Position {
public static final String ID = "id";
public static final String LATITUDE = "latitude";
public static final String LONGITUDE = "longitude";
public static final String BEARING = "bearing";
public static final String ACCURACY = "accuracy";
public static final String SPEED = "speed";
public static final String USER_ID = "user_id";
@Column(name = ID, unique = true)
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = {@org.hibernate.annotations.Parameter(name = "property", value = "user")})
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = LATITUDE)
private double latitude;
@Column(name = LONGITUDE)
private double longitude;
@Column(name = BEARING)
private double bearing;
@Column(name = ACCURACY)
private double accuracy;
@Column(name = SPEED)
private double speed;
@OneToOne
@PrimaryKeyJoinColumn
@Cascade(CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
private User user;
}
我正在將新對象保存到數據庫中。 除了一件事,一切都正確。 字段user_id
和position_id
為空。 有什么解決方案可以幫助我做到這一點嗎?
將需要一些步驟來解決您的問題。
讓我們從一對一關聯中開始,只有一個外鍵,您可以決定哪個實體擁有該外鍵。
@joinColumn
批注應該僅在所屬實體中,例如,如果您確定用戶將擁有位置鍵作為外鍵,則@joinColumn
批注將在用戶實體中的position字段下。
在另一個實體上只使用
@OneToOne(mappedby = "the_matching_field_on_the_other entity")
例如:
CREATE TABLE "user"
(
id INTEGER PRIMARY KEY NOT NULL,
phone TEXT,
position_id BIGINT,
CONSTRAINT user_position_id_fk FOREIGN KEY (position_id) REFERENCES position (id)
);
CREATE TABLE position
(
id INTEGER PRIMARY KEY NOT NULL,
latitude DOUBLE PRECISION,
longitude DOUBLE PRECISION,
bearing DOUBLE PRECISION,
accuracy DOUBLE PRECISION,
speed DOUBLE PRECISION,
);
@Entity
@Table(name = "user")
public class User {
public static final String ID = "id";
public static final String PHONE = "phone";
public User() {
position = new Position();
}
@Id
@Column(name = ID, unique = true)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = PHONE)
private String phone;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "position_id")
private Position position;
}
@Entity
@Table(name = "position")
public class Position {
public static final String ID = "id";
public static final String LATITUDE = "latitude";
public static final String LONGITUDE = "longitude";
public static final String BEARING = "bearing";
public static final String ACCURACY = "accuracy";
public static final String SPEED = "speed";
public static final String USER_ID = "user_id";
@Column(name = ID, unique = true)
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = {@org.hibernate.annotations.Parameter(name = "property", value = "user")})
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = LATITUDE)
private double latitude;
@Column(name = LONGITUDE)
private double longitude;
@Column(name = BEARING)
private double bearing;
@Column(name = ACCURACY)
private double accuracy;
@Column(name = SPEED)
private double speed;
@OneToOne(mappedBy = "position")
private User user;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.