如何在Hibernate中实现自定义数据类型?



我们想在Java中键入各种属性。例如:电子邮件地址

但现在我总是收到消息:

Could not set field value [test@test.de] value by reflection : [class customer.email] setter of customer.email;
Can not set dataType.EmailAddress field customer.email to java.lang.String

我该怎么做?

@Entity
public class customer {
@Id
@GeneratedValue
private Long id;
private String name;
private EmailAddress email;
}

public class EmailAddress {
public String value;
public EmailAddress(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public boolean setValue(String s) {
this.value = s;
return true;
}
public String mailbox() ...
public String host() ...
public String tld() ...
}

未调用HibernateDefaultType的Getter和Setter。

编辑:最后。我想在数据库中存储一个字符串与电子邮件地址。在Java中,我想要EmailAddress对象。

这就容易多了。AttributeConverter让它变得非常简单。

https://thorben-janssen.com/jpa-attribute-converter/

Thank you very much

编辑:代码如下:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class EmailAddressConverter implements AttributeConverter<EmailAddress, String> {
@Override
public String convertToDatabaseColumn(EmailAddress emailAddress) {
return emailAddress.value;
}
@Override
public EmailAddress convertToEntityAttribute(String s) {
return new EmailAddress(s);
}
}

在实体中:

@Convert(converter = EmailAddressConverter.class)
private EmailAddress email;

下面是一些自定义类型的例子。

public class EmailAddressDescriptor extends AbstractTypeDescriptor<String> {
protected EmailAddressDescriptor() {
super(String.class, new ImmutableMutabilityPlan<>());
}
@Override
public String toString(String value) {
return null;
}
@Override
public String fromString(String string) {
return null;
}
@Override
public <X> X unwrap(String value, Class<X> type, WrapperOptions options) {
return null;
}
@Override
public <X> String wrap(X value, WrapperOptions options) {
return null;
}
@Override
public SqlTypeDescriptor getJdbcRecommendedSqlType(JdbcRecommendedSqlTypeMappingContext context) {
return null;
}

}

然后你会用你所有的方法来创建Email地址类

public class EmailAddress extends AbstractSingleColumnStandardBasicType<String> {
private String value;
public EmailAddress() {
super(new VarcharTypeDescriptor(), new EmailAddressDescriptor());
}
@Override
public String getName() {
return "EmailAddress";
}
@Override
public Object resolve(Object value, SharedSessionContractImplementor session, Object owner, Boolean overridingEager) throws HibernateException {
return null;
}
}
public String mailbox() ...
public String host() ...
public String tld() ...

你将如何在你的实体中使用它,就像这样

@Entity
@TypeDef(name = "emailAddress", typeClass = EmailAddress.class)
public class customer {
@Id
@GeneratedValue
private Long id;
private String name;
@Type (type = "emailAddress")
private EmailAddress emailAddress;
}

希望有帮助

最新更新