簡體   English   中英

Hibernate @OneToOne連接列

[英]Hibernate @OneToOne join column

我有2個表格:用戶和個人資料。 用戶可以不存在個人資料而存在,但是個人資料實體必須具有唯一的用戶ID。

+-----------------------------------+
|                user               |
+-----------------------------------+
| id |   nickname  |    password    |
+----+-------------+----------------+
|  1 |    admin    |      pass      |
+----+-------------+----------------+

+-----------------------------------+
|               profile             |
+-----------------------------------+
| id |   user_id   |     status     |
+----+-------------+----------------+
|  1 |     1       |  java forever  |
+----+-------------+----------------+

我如何在@Entity類中連接它們? 此代碼不起作用:

@Entity
@Table(name="profiles")
public class Profile {
@Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    @JoinColumn(name = "user")
    @JsonIgnore
    private User user;
}

@Entity
@Table(name = "users")
public class User {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "nickname", length = 50, unique = true)
    @NotNull
    private String nickname;

    @OneToOne(mappedBy = "profile")
    Profile profile;
}

可選地,我可以將'profile_id'列放到用戶表中(它可以為null),但是我正在嘗試使用這種類型的數據庫表。 怎么了?

嘗試添加optional=false

@OneToOne(optional=false)
@JoinColumn(name = "user")
@JsonIgnore
private User user

when: optional=false由NOT NULL指定

因此,如果您確定,一個配置文件僅屬於一個用戶,則您的類可能如下所示:

@Table(name="profiles")
public class Profile {

(.....)

@Column(name="id", nullable=false, length=10)   
@Id 
@GeneratedValue(generator="PROFILE_ID_GENERATOR")   
@org.hibernate.annotations.GenericGenerator(name="PROFILE_ID_GENERATOR", strategy="native") 
private Integer id;

@Column(name="status", nullable=true, length=20)    
private String status;

@PrimaryKeyJoinColumn   
@OneToOne(optional=false, targetEntity=User.class, fetch=FetchType.LAZY)    
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK}) 
@JoinColumns({ @JoinColumn(name="userid", referencedColumnName="id", nullable=false) }) 
private User user;

@Column(name="userid", nullable=false, insertable=false, updatable=false)   
@Id 
@GeneratedValue(generator="PROFILE_USERID_GENERATOR")   
@org.hibernate.annotations.GenericGenerator(name="PROFILE_USERID_GENERATOR", strategy="foreign", parameters=@org.hibernate.annotations.Parameter(name="property", value="user"))    
private int userId;

(....)
}


public class User {
(.....)

@Column(name="id", nullable=false, length=10)   
@Id 
@GeneratedValue(generator="USER_ID_GENERATOR")  
@org.hibernate.annotations.GenericGenerator(name="USER_ID_GENERATOR", strategy="native")    
private int id;

@Column(name="nickname", nullable=true, length=25)  
private String nickname;

@Column(name="password", nullable=true, length=25)  
private String password;

@OneToOne(mappedBy="user", targetEntity=Profile.class, fetch=FetchType.LAZY)    
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK}) 
private Profile profile;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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