【问题标题】:Add array of string to database in Hibernate在 Hibernate 中将字符串数组添加到数据库
【发布时间】:2013-04-16 09:43:59
【问题描述】:

我是 Hibernate 框架的初学者,现在我将 Spring 和 Hibernate 集成到一个项目中。 我运行它没问题,但它有一些我不明白为什么。问题是:

我在这里描述了 bean 类:

@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)类来持久化对象。

如果数据库使用默认字符集,则可以,运行并且没有任何错误,但是当我在数据库系统中选择表时,它会显示一个不可读的字符串,类似于 ¬í ur [Ljava.lang.String;­ÒVçé{G xp t Quidditcht Herbology 。我认为当我想读取和填充对象时,Hibernate 给出了拆分的“占位符”。

但问题是如果数据库系统使用utf8 charset,则无法运行,并抛出类似Incorrect string value: '\xAC\xED\x00\x05ur...' for column 'interests' at row 1的异常

我认为是因为带有 utf8 字符集的数据库不支持该字符串。

对此有什么想法吗?

谢谢!

【问题讨论】:

    标签: database spring hibernate spring-mvc


    【解决方案1】:

    您当前的代码正在尝试将调用 toString 的结果保留在兴趣数组上。

    您需要设置 getInterests 以返回格式化字符串或映射到不同的表作为单对多关系。由于您可能想从 DB 中填充兴趣,我会推荐第二个选项(我有 annoate do 字段,但您可以轻松地将其更改为使用 getter,实际上我应该对我的 getter 进行注释):

     @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;
    

    【讨论】:

    • 如你所说,我坚持在interests数组上调用toString的结果,为什么当我读回它时,Hibernate可以清楚地读取它,虽然它是一个不可读的字符串?如果我更改 getInterests 以返回格式化字符串,Hibernate 可以读回它吗?我也需要更改 setInterests 和拆分吗?
    • 现在我换了public String getInterests() {//code here},收到错误信息,你知道,因为properties是数组,get方法的返回需要是一个字符串数组。
    • "为什么当我读回它时,Hibernate 可以清楚地读取它,虽然它是一个不可读的字符串?"那没有意义。 Hibernate 会将它作为一个字符串读回,这就是我建议第二个选项的原因。但我建议你在开始休眠之前完全了解 toString 和一般的 java OOP。
    • 我只想将它保存为普通字符串,我可以通过使用空格标记将其拆分以获取字符串数组。所以,谢谢你的回复!
    • 有没有办法只使用String类,不需要使用其他实体?
    【解决方案2】:

    我看过你的代码,我认为在“interests”字段中,你想存储数组中的任何值,并且在从数据库中检索时相同。 您需要使用enum 的功能,但不知道您的数据库是否支持? 我在我的一个项目中具有相同的功能,我们在数据库中使用了 DB enum,它是 PostgreSQL。 如果您的数据库不支持enum,那么您必须使用OneToMany,并且必须为兴趣创建单独的表进行映射。

    【讨论】:

    • 谢谢!我使用一些取决于用户选择的数据库系统。我需要考虑正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2011-04-03
    • 2015-02-15
    相关资源
    最近更新 更多