Java 休眠@OneToOne连接列

Java 休眠@OneToOne连接列,java,hibernate,orm,hibernate-mapping,one-to-one,Java,Hibernate,Orm,Hibernate Mapping,One To One,我有两个表:user和profile。用户可以不使用配置文件而存在,但配置文件实体必须具有唯一的用户id。 如何在@Entity类中连接它们? 此代码不起作用: @Entity @Table(name="profiles") public class Profile { @Id @Column(name="id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @One

我有两个表:user和profile。用户可以不使用配置文件而存在,但配置文件实体必须具有唯一的用户id。

如何在@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),但我尝试使用这种类型的DB表。
怎么了?

尝试添加
optional=false

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

当:
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;

}

但配置文件必须有用户,而不是空的唯一用户id。然而,用户可以没有配置文件。它不应该是多用户关系吗?一个配置文件可供多人使用?不,一个用户可以拥有0或1个配置文件。当然,但同一个配置文件应可供不同的人使用。也许我误解了用例^^一个配置文件只能由一个用户使用。
@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;

}