我们想在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;
}
希望有帮助