【发布时间】: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