Database 在Hibernate中将字符串数组添加到数据库
我是Hibernate框架的初学者,现在我在一个项目中集成了Spring和Hibernate。 我运行的很好,但有些东西我不明白为什么。问题是: 我在这里描述了bean类:Database 在Hibernate中将字符串数组添加到数据库,database,spring,hibernate,spring-mvc,Database,Spring,Hibernate,Spring Mvc,我是Hibernate框架的初学者,现在我在一个项目中集成了Spring和Hibernate。 我运行的很好,但有些东西我不明白为什么。问题是: 我在这里描述了bean类: @Entity @Table(name = "Sample") public class Sample { private int id; private String firstName; private String lastName; private String sex; pr
@Entity
@Table(name = "Sample")
public class Sample {
private int id;
private String firstName;
private String lastName;
private String sex;
private String[] interests;
@Id
@GeneratedValue
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "firstName")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Column(name = "lastName")
public String getLastName() {
return lastName;
}
public void setSex(String sex) {
this.sex = sex;
}
@Column(name = "sex")
public String getSex() {
return sex;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
@Column(name = "interests")
public String[] getInterests() {
return interests;
}
}
在这个类中,你们看,我有兴趣字段是一个字符串数组,它显示了很多复选框
在DAO中,当控制器调用将对象保存到数据库时,我只是在Spring中使用hibernateTemplate.saveOrUpdate(sample)
类来持久化对象
若数据库使用默认的字符集,那个么它可以运行,并且并没有任何错误,但当我在数据库系统中选择table时,它会显示一个不可读的字符串,类似于,?[Ljava.lang.string;?ÒVçé{G xp t Quidditcht Herbology
。我想这是Hibernate给split的“占位符”,当我想读取并填充对象时
但问题是,如果数据库系统使用utf8字符集,它将无法运行,并引发类似于错误字符串值的异常:'\xAC\xED\x00\x05ur…'对于第1行的“兴趣”列
我认为这是因为utf8字符集的数据库不支持该字符串
你知道吗
谢谢!您当前的代码正在尝试保留在兴趣数组上调用toString的结果 您需要设置getInterests以返回格式化字符串或将其映射到另一个表作为onetomany关系。由于您可能希望从DB填充兴趣,我建议使用第二个选项(我有annoate do字段,但您可以轻松地将其更改为使用getters,事实上我应该使用dprobably annoate my getters):
我查看了您的代码,我认为在“
兴趣
”字段中,您希望存储数组中的任何值,并在从数据库检索时存储相同的值。
您需要使用enum
这类功能,但不知道您的数据库是否支持?
我在我的一个项目中使用了相同的功能,我们在数据库中使用了DBenum
,它是PostgreSQL。
如果您的数据库不支持
enum
,那么您必须使用OneToMany
,并且必须为兴趣创建单独的表以进行映射。正如您所说,我保留了调用兴趣数组上的toString的结果,为什么Hibernate在我读回它时可以清晰地读取它,尽管它是一个不可读的字符串?如果我更改了getInteRest返回格式化字符串,Hibernate能读回吗?我需要更改setInterests并进行拆分吗?现在我更改了公共字符串getInterests(){//code here}
,并收到一条错误消息,因为属性是数组,所以get方法的返回需要是字符串数组。“为什么Hibernate可以在我读回它时清晰地读取它,尽管它是一个不可读的字符串?"这没有意义。Hibernate会将其读回为一个字符串,这就是我建议第二个选项的原因。但我建议您在启动Hibernate之前完全了解toString和通用java OOP。我只想将其保存为普通字符串,我可以使用空格标记将其拆分为字符串数组。因此,感谢您的回复!我可以吗我没有任何方法只使用字符串类而不需要使用其他实体?谢谢!我使用一些数据库系统,这取决于用户的选择。我需要考虑正确的方法。
@OneToMany(mappedBy = "sample", cascade = CascadeType.ALL)
private List<Interests> interests;
@Column(nullable = false, unique = false, length = 256)
private String text;
@ManyToOne
@JoinColumn(nullable = false)
private Sample sample;