2010-11-12 32 views

回答

8

无休眠纯JPA是利用某种转换

private boolean enabled; 

@Transient 
public boolean isEnabled() { 
    return this.enabled; 
} 
public void setEnabled(boolean enabled) { 
    this.enabled = enabled; 
} 

@Column(name="ENABLED") 
public String getEnabledAsString(){ 
    return enabled ? "Y" : "N"; 
} 

public void setEnabledAsString(String enabled){ 
    this.enabled = "Y".equalsIgnoreCase(enabled); 
} 

闲来无事

+0

是的,这将工作(+1)。本周末我将通过邮件与您联系,询问我未回答的待定评论。我对这个想法非常感兴趣,所以让我们来讨论:) – 2010-11-12 09:04:50

+0

所以这是getter/setter方法。我希望有更简单的方法来解决这个问题。为什么JPA标准没有为此提供注释支持? – newguy 2010-11-14 22:15:15

+0

这也不处理数据库中列的值为NULL的情况。您可以修改以获取NULL值,但是当您将其置入时,它将转换为“N”。 – newguy 2010-11-14 22:36:02

1

与上述相类似(@Arthur罗纳德·加西亚FD)实现,但是你也可以使用JPA现场访问和将伊娃留在具有临时访问器的数据库类型中 - 标记为@Transient。这确保JPA通过字段访问访问实体,但保留访问器可用于适当类型的用法。

使用上面的例子:

@Column(name="isconstrained") 
private int isConstrained; 

@Transient 
pubic boolean getIsConstrained() { 
    return (isConstrained == 1); 
} 

@Transient 
public void setIsConstrained(boolean isConstrained) { 
    this.isConstrained = (isConstrained? 1 : 0); 
} 
+0

唯一的缺点是您可能无法维护生成的JPA类 - 因为您已经为您定制了访问器。如果这很重要,则可能需要为您的JPA类构建一个生成器工厂。不确定这是否可以通过eclipse jetty完成? – wmorrison365 2013-01-16 10:03:38

5

这是不使用getter/setter方法纯JPA,所以它回答了这个问题:

@Entity 
public class Person {  

    @Convert(converter=BooleanToStringConverter.class) 
    private Boolean isAlive;  
    ... 
} 

然后:

@Converter 
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> { 

    @Override 
    public String convertToDatabaseColumn(Boolean value) {   
     return (value == null || !value) ? "N" : "Y";    
     }  

    @Override 
    public Boolean convertToEntityAttribute(String value) { 
     return "Y".equals(value); 
     } 
    } 

请注意这个解决方案是JPA 2.1,并且在问题首次被问到时不可用:JPA 2.1 specificat离子放出4月22日2013年

2

您可以使用这样

@Entity 
public class Employee { 
@Convert(converter=BooleanTFConverter.class) 
private Boolean isActive; 
} 

@Converter 
public class BooleanYNConverter implements AttributeConverter<Boolean, String>{ 
@Override 
public String convertToDatabaseColumn(Boolean value) { 
    if (value) { 
     return "Y"; 
    } else { 
     return "N"; 
    } 
} 
@Override 
public Boolean convertToEntityAttribute(String value) { 
    return "Y".equals(value); 
} 

}

相关问题