@ManyToOne和@OneToOne与@EmbeddedId的关系 [英] @ManyToOne and @OneToOne relations with @EmbeddedId
问题描述
我正在尝试将数据库实体的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,则不应使用排序-仅使用唯一的序列生成字段或唯一的复合业务字段.>
第二个问题是用户中的joinColumn定义.您已将它们标记为updatable = false,insertable = false,这意味着无法通过映射更改外键,这就是为什么无论设置关系如何它们始终为null的原因.从每个设置中删除updatable = false,insertable = false设置,以在设置关系时设置字段.
I am trying to change the id of my database entities from a single long to a composite id consisting of two long's which are encapsulated in my ID.class shown below. What annotations would you use for ManyToOne and OneToMany relations? Did I made a mistake with my annotations, especially with @JoinColumns, @Embeddable and @EmbeddedId. My problem is that relations are stored with null;
My ID class consist of an autogenerated long (pid) and a manually set secondary long (sid). This is the ID for all my entity classes:
@Embeddable
public class ID implements Serializable {
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long pid;
@Column(nullable=false)
private long sid;
}
My Entity-class (example) has a many-to-one relation to Office a one-to-one relation to Settings (both relations are uni-directional).
@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 class (Many-To-One example):
@Entity
@Table(name = "office")
public class Office {
@EmbeddedId
private ID id;
@Column(length = 128)
private String description;
}
Account class (One-To-Many example):
@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;
}
Thanks in advance for your help.
Sequencing shouldn't be used if you want a composite pk - use only the sequence generated field which is unique, or composite business fields that are unique.
Second issue is the joinColumn definitions in User. You have marked them as updatable=false, insertable=false which means the foreign keys cannot be changed through the mappings, and is why they are always null regardless of setting the relationship. Remove the updatable=false, insertable=false settings from each to have the fields set when you set the relationship.
这篇关于@ManyToOne和@OneToOne与@EmbeddedId的关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!