我正在尝试在 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;
}
hibernate 数据库生成后的我的数据库脚本。
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;
最佳答案
问题似乎是您在“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”列。
关于java - HIbernate 一对一注释不会在从属表中生成外键 GerericGenerator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337835/