我试图将数据库实体的ID从单个long更改为包含两个long的复合ID,这些ID封装在下面显示的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; }
在此先感谢您的帮助。
如果要合成pk,则不应使用排序-仅使用唯一的序列生成字段或唯一的合成业务字段。
第二个问题是User中的joinColumn定义。您已将它们标记为updatable = false,insertable = false,这意味着无法通过映射更改外键,这就是为什么无论设置关系如何它们始终为null的原因。从每个设置中删除updatable = false,insertable = false设置,以在设置关系时设置字段。