java - HIbernate 一对一注释不会在依赖表中生成外键 GerericGenerator

原文 标签 java spring hibernate postgresql jpa-2.1

我正在尝试在 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/

相关文章:

java - hibernate 事务结束示例

java - 为什么这个 ajax 操作不适用于 requestScope?

spring - 如何在独立的Tomcat中运行的Spring Boot应用程序中设置cookie名称?

java - 如何将具有动态键的文档映射到 Spring MongoDb 实体类

java - 通过列表属性内的参数查询实体

mysql - javax.persistence.EntityExistsException:具有相同标识符值的另一个对象已与 session 关联

java - 在JTextField中粘贴内容时要使用什么事件?

java - Android Button背景图片更改回XML状态

java 。工件部署 Tomcat 8 期间出错

hibernate - Grails Domain Binder.getMapping(Domain)对于Grails-3.2.4中的非持久性域返回null