休眠:将单个表组的属性分为一个子类

时间:2019-01-04 12:04:45

标签: java hibernate relational-database

我想做:

create table user (
    id bigint primary key auto_increment,
    firstname varchar(128),
    lastname varchar(128),
    street varchar(128),
    zipcode mediumint,
    city varchar(128)
)

然后:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstname;

    private String lastname;

    private Address address; // Here I want an Address rather than street, zip, and city directly inside User

    ...

} 

和:

public class Address {

    private String street;

    private Integer zipcode;

    private String city;

    ...

}

(这是一个示例)

如何使用Hibernate做到这一点? @OneToOne?这个问题似乎很简单,而且由于我在这里找不到解决方案,因此它必须很明显。

2 个答案:

答案 0 :(得分:2)

首先,用Address注释您的@Embeddable类:

@Embeddable
public class Address {
    /*class definition here*/
    ...
}

然后以这种方式更新用户类:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstname;

    private String lastname;

    @Embedded
    private Address address; 

    ...

} 

就是这样。如果您需要更复杂的示例,请查看here。只需注意模型类的定义,无论您是否使用Spring Boot,只要使用JPA处理数据库,这都没有区别。

答案 1 :(得分:-1)

您可以使用@OneToOne注释通过一对一关系来关联实体。

  @Entity
  public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Address address; 

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    public Address getAddress()
    {
     return address;
    }
  } 

参考: https://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association