簡體   English   中英

休眠-一對一關系

[英]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_idposition_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM