我正在尝试将数据库实体的 id 从单个 long 更改为由两个 long 组成的复合 id,这两个 long 封装在我的 ID.class 中,如下所示。您会为 ManyToOne 和 OneToMany 关系使用什么注释?我的注释是否有错误,尤其是 @JoinColumns、@Embeddable 和 @EmbeddedId。我的问题是关系存储为 null;
我的 ID 类由自动生成的 long (pid) 和手动设置的辅助 long (sid) 组成。这是我所有实体类的 ID:
@Embeddable
public class ID implements Serializable {
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long pid;
@Column(nullable=false)
private long sid;
}
我的实体类(示例)与 Office 具有多对一关系,与设置具有一对一关系(两种关系都是单向的)。
@Entity
@Table(name="user")
public class User {
@EmbeddedId
private ID id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "office_pid", referencedColumnName = "pid", updatable=false, insertable=false),
@JoinColumn(name = "office_sid", referencedColumnName = "sid", updatable=false, insertable=false)
})
private Office office;
@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "setting_pid", referencedColumnName = "pid", updatable=false, insertable=false),
@JoinColumn(name = "setting_sid", referencedColumnName = "sid", updatable=false, insertable=false)
})
private Settings setting;
@OneToMany(mappedBy = "user", cascade=CascadeType.REMOVE, fetch=FetchType.LAZY)
private List<Account> accounts= new ArrayList<>();
}
Office 类(多对一示例):
@Entity
@Table(name = "office")
public class Office {
@EmbeddedId
private ID id;
@Column(length = 128)
private String description;
}
帐户类别(一对多示例):
@Entity
@Table(name="account")
public class Account {
@EmbeddedId
private ID id;
@Column(length = 16)
private String description;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = "user_pid", referencedColumnName = "pid"),
@JoinColumn(name = "user_sid", referencedColumnName = "sid")
})
private User user;
}
在此先感谢您的帮助。