【问题标题】:How do i map enums in a many to many relationship我如何在多对多关系中映射枚举
【发布时间】:2020-12-19 23:08:46
【问题描述】:

我正在处理一个项目,在将我的实体关系模型转换为 Java 代码时遇到问题。 我不确定我是否可以在这里发布代码,所以我做了一个类似于我遇到的问题的示例。

这是我创建的 ERM:

Person 和 address 都应该是类,一个人应该有 2 个地址,这就是为什么我选择两个变量“HomeAdress”和“WorkingAdress”而不是列表或数组。 但因此我不确定如何在 Java 中编写这种关系,或者它是否可能,或者我是否需要其他方法。(我在写这个问题时找到了解决方案)

Hobbies 应该是一个枚举,一个 Person 可以有多个爱好,也可以没有。一个爱好可以分配给多个人,也可以不分配给一个人。我不太确定如何在多对多关系中分配枚举。

我给你看我目前的代码。

爱好:

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "hobbies")
public enum Hobby {
    FISHING("Fishing"),
    HIKING("Hiking"),
    FOOTBALL("Football"),
    DANCING("Dancing"),
    NETFLIX("Netflix");
    
    private String description;
    
    private Hobby(String description) {
        this.description = description;
    }
    
    @Override
    public String toString() {
        return this.description;
    }
}

人物类:

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="person")
public class Person {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name="name")
    private String name;
    @OneToMany(mappedBy="state", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Address homeAddress;
    @OneToMany(mappedBy="state", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Address workingAddress;
    @Enumerated(EnumType.STRING)
    @Column(name="hobbies")
    private Hobby[] hobbies;
}

地址类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "street")
    private String street;
    @Column(name = "city")
    private String city;
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name= "workingAdress", nullable = false),
        @JoinColumn(name= "homeAddress", nullable = false)
    })
    private Person person;

在写这个问题时,我发现了@JoinColumns 注释,这似乎解决了我的一个问题。现在我可以将两个可能的连接列分配给一个变量。 然而,映射枚举的问题仍然存在。因为我在运行这段代码时得到了 org.hibernate.AnnotationException。它说没有为实体指定标识符:爱好。

我会为枚举实现一个 id 吗?我不能使用枚举值作为 id 吗?或者,也许整个映射都是假的。我希望你能帮助我。

我也很高兴您能给我任何建议。因为我对编码很陌生,所以我会尽可能地改进。

【问题讨论】:

  • 我发现我犯了一个错误,因为人和地址之间的关系并不是真正的一对多或多对一,它只是一对一,因为我有两个地址的单独变量一个地址只属于一个人。

标签: java hibernate enums entity-relationship-model


【解决方案1】:

好吧,经过一整天的尝试不同的事情并试图找到解决方案,我放弃了,让 Hobby 成为一个类而不是一个枚举。现在它工作正常。 似乎制作数组或枚举集合以保持休眠状态是一种不好的做法。因为在互联网上很难找到任何关于它的信息,如果你找到一个关于它的线程,它已经有 10 年历史了,解决方案不再起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2013-08-25
    • 2014-08-17
    • 2011-03-10
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多