我正在努力将现有项目转换为使用Hibernate。我有这样的课:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@Column(name = "group_id_user")
private Long groupId;
@Column(name = "name")
private String name;
...
// getters and setters....
}
和这样的课程:
@Entity
@Table(name = "group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long groupId;
@Column(name="group_name")
private String groupName;
...
// getters and setters....
}
user
表中名为"group_id_user"
的列应该是group
表中名为"group_id"
的列的外键。
将按如上图所示结构的类构造的类是可以的,或者应该如下所示,以确保数据库中的外键存在?
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@ManyToOne
@JoinColumn(name = "group_id_user")
private Group group;
@Column(name = "name")
private String name;
...
// getters and setters....
}
和
@Entity
@Table(name = "group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long groupId;
@Column(name="group_name")
private String groupName;
...
// getters and setters....
}
我尝试使用两种格式,但两种方式都遇到了问题。当我使用第一种格式时,我在创建查询时与加入的HQL语法有问题。当我尝试第二种格式时,我会在没有Group
的情况下从数据库中获取User
或从JSON对象添加新的User
的问题,该对象具有groupId
而不是Group
对象。因此,在我花时间在两种格式之间来回切换之前,我想确定我应该使用注释来最适合行业标准?
如果您也可以更改列的名称,我会尝试这样的东西:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //This means you will need the database to generate the ids, if you are using Oracle this won't work. You would need to use SEQUENCE.
private Long id;
@ManyToOne
@JoinColumn(name = "group_id") //There will be no need to specify the join column if you use group_id.
private Group group;
@Column(name = "name")
private String name;
...
// getters and setters....
}
@Entity
@Table(name = "groups")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="group_name")
private String groupName;
...
// getters and setters....
}
另外,如果您可以将表的名称更改为复数。
我也使用了对我有很大帮助的东西。我有一个名为"可识别"的超级类,它只有ID,看起来像这样:
@MappedSuperclass
public class Identifiable implements Serializable {
private static final long serialVersionUID = -9027542469937539859L;
@Id
@Column(name = "ID")
@GeneratedValue
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Identifiable other = (Identifiable) obj;
if (id == null) {
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
您可以轻松地使用ID扩展所有类,例如:
@Entity
@Table(name = "users")
public class User extends Identifiable {
private static final long serialVersionUID = -90275424699375956859L;
@ManyToOne
@JoinColumn(name = "group_id") //There will be no need to specify the join column if you use group_id.
private Group group;
@Column(name = "name")
private String name;
...
// getters and setters....
}
但是,如果您不能更改名称,请让我们知道您对投掷的痕迹遇到的问题,我们也许可以提供帮助。
谢谢!