类似列的Hibernate映射

时间:2017-10-16 03:05:57

标签: java sql hibernate

如果我创建一个像:

这样的表
CREATE TABLE IF NOT EXISTS `user`(
    `id`            INT     NOT NULL    AUTO_INCREMENT,
    `email_1_type`  INT     NULL,
    `email_1`       VARCHAR(255)    NULL,

    `email_2_type`  INT     NULL,
    `email_2`       VARCHAR(255)    NULL,

    `email_3_type`  INT     NULL,
    `email_3`       VARCHAR(255)    NULL,

    PRIMARY KEY (`id`)
)

我可以将email列映射为列表吗?像:

public class Email{
    private int type;
    private String email;

    // getter & setter
}

@Entity
@Table(name = "info_req_chat_time_detail")
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private List<Email> emails;

    // getter & setter
}

1 个答案:

答案 0 :(得分:0)

不要这样做。 Java集合类型用于将关系映射到需要外键的其他表。

https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html

  

作为要求,必须声明持久的集合值字段   作为接口类型(参见例7.2,“使用的集合映射”)   @OneToMany和@JoinColumn“)。实际的界面可能是   java.util.Set,java.util.Collection,java.util.List,java.util.Map,   java.util.SortedSet,java.util.SortedMap或任何你喜欢的东西   (&#34;你喜欢的任何东西&#34;意味着你必须编写一个实现   org.hibernate.usertype.UserCollectionType)。

如果只有Phones包含id(FK), emailType, emailValue的另一个表,那么这将是一个很好的设计。然后你可以做你正在列出的内容。

但是,如果您试图保持简单,并且确实知道3部手机,那就不要这样做了。您永远不知道您何时想要修改或扩充其中一个SQL列。如果需要在Java类中使用List,请构建一个private List<Email> getAllEmailsAsList()方法,收集所有单个电子邮件字段并将其打包到列表中。

@Entity课程中使用6个额外的成员字段来处理此表的创建并没有错。