2014-09-20 2 views
0

В моей таблице базы данных есть столбец CHAR(1), который может содержать Y или N в качестве содержимого (ограничение CHECK). Я определил свойство String в Java и String-based setter в моем классе. Кроме того, для удобства я добавил setter/getter с булевыми аргументами.Как Hibernate отображает сеттеры/геттеры для свойств?

Мое предположение заключалось в том, что Hibernate использует сеттер/получатель на основе String для доступа к базе данных. Однако во время выполнения я получаю IllegalArgumentExceptions и несоответствие типов между булевыми и String.

Итак, на основе каких свойств Hibernate выполняет сопоставление? Имена методов? Имена аргументов? Типы аргументов? Можно ли использовать final в сеттере или это может случиться? Не имеет значения, если мое свойство имеет другое имя, чем мой столбец таблицы?

private String foobar = "N"; 

public void setFoobar(final String foobar) { 
    this.foobar = foobar; 
} 

@Column(name = "FOOBAR") 
public String getFoobar() { 
    return this.foobar; 
} 

@Transient 
public void setFoobar(final boolean foobar) { 
    this.setFoobar(foobar ? "Y" : "N"); 
} 

@Transient 
public boolean isFoobar() { 
    return (this.getFoobar().equals("Y") ? true : false); 
} 
+0

Вы должны попробовать с @Column (name = "FOOBAR", columnDefinition = "CHAR") public Character getFoobar() – MGorgon

ответ

1

Я думаю, что эта проблема происходит потому, что вы используете то же имя для обоего String и boolean свойств (то есть получатели и установщики) - пытаются использовать разные имена для них.

В качестве альтернативы вы можете использовать встроенный тип, который автоматически обрабатывает это преобразование - просто добавьте комментарий к свойству boolean с помощью @Type(type = "yes_no").

Смежные вопросы