HIbernate 一对一注释未在依赖表中生成外键 GerericGenerator
Posted
技术标签:
【中文标题】HIbernate 一对一注释未在依赖表中生成外键 GerericGenerator【英文标题】:HIbernate one-to-one annotation isn't generating foreign key GerericGenerator in dependent table 【发布时间】:2014-06-21 02:49:26 【问题描述】:我正在尝试在 Person 和 Auth 表之间创建 OneToOne 关系。问题是当生成数据库表“Auth”时,我没有在 AUTH 表中看到应该引用 Person 的外键。目的是让 Auth 表使用与 Person 表相同的主键。
@MappedSuperclass
public abstract class DomainBase
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Version
@Column(name="OPLOCK")
private Integer version;
@Entity
@Table(name = "person")
public class Person extends DomainBase
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="auth_id")
private Auth auth;
@Entity
public class Auth
@Id
@GeneratedValue(generator="foreign")
@GenericGenerator(name="foreign", strategy = "foreign", parameters=
@Parameter(name="property", value="person")
)
@Column(name="person_id")
private int personId;
---------------------------------
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private Person person;
休眠数据库生成后的我的数据库脚本。
CREATE TABLE auth
(
person_id integer NOT NULL,
activate boolean,
activationid character varying(255),
last_login_attempt_date timestamp without time zone,
last_login_attempt_timezone character varying(255),
last_login_date timestamp without time zone,
last_login_timezone character varying(255),
nonlocked boolean,
num_login_attempts integer,
CONSTRAINT auth_pkey PRIMARY KEY (person_id),
CONSTRAINT uk_d68auh3xsosyrjw3vmwseawvt UNIQUE (activationid)
)
WITH (
OIDS=FALSE
);
ALTER TABLE auth
OWNER TO postgres;
【问题讨论】:
【参考方案1】:似乎问题在于您在“person”表和“auth”表之间声明了两次@OneToOne注释,而没有指定它们之间的关系。看看hibernate documentation,在2.2.5.1点,有一些关于使用一对一关联的例子。
对我来说,最好的方法是在一个表中设置关联,即声明外键列的表,并在另一个对象中使用mappedBy
参数。在您的代码中,这将是:
@Entity
@Table(name = "person")
public class Person extends DomainBase
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="auth_id")
private Auth auth;
@Entity
public class Auth
@Id
@GeneratedValue(generator="foreign")
@GenericGenerator(name="foreign", strategy = "foreign", parameters=
@Parameter(name="property", value="person")
)
@Column(name="person_id")
private int personId;
@OneToOne(mappedBy = "auth")
private Person person;
....
这是hibernate文档中的第二个示例,在“在以下示例中,关联实体通过显式外键列链接”这句话之后引入。我测试了这段代码,出现了“auth_id”列。
【讨论】:
缺少休眠文档。是什么让 onetoone 成为共享主键?从您显示的文档中,我看不出是什么原因。你能解释一下吗? 通过“共享主键”,我的意思是使用一个表的 id 就像另一个表中的外键一样,以允许它们之间的关系。我不应该使用“共享”这个词。我编辑我的答案 使用该配置,我收到此错误 -> 在尝试执行此操作时尝试从空的一对一属性 [XXXXX.domains.Auth.person] 分配 id link跨度> 当你为一个人设置一个认证时,认证必须有一个id。为了实现这一点,创建一个身份验证,保存它,获取它,然后将它与一个人对象相关联。具体而言,在第 3 行和第 4 行之间添加Auth authSaved = this.authRepository.save(auth)
。您可能需要更改身份验证 ID 的生成值策略。如果是这种情况,请使用@GeneratedValue(strategy = GenerationType.AUTO)
而不是@GeneratedValue
和@GenericGenerator
注释,它应该可以工作。
认为这是使用共享主键的目的。就像所有者将其持久主键共享给他的依赖一样,作为回报,依赖将使用该值作为它自己的主键。以上是关于HIbernate 一对一注释未在依赖表中生成外键 GerericGenerator的主要内容,如果未能解决你的问题,请参考以下文章