我想将一个属性作为Long存储到数据库中,但是在代码中使用带有辅助方法的对象。
但是,对象类型是我自定义的类型,它具有我想要存储到数据库的内部值(长)。
public final class MyBean extends Number implements Serializable, Comparable<MyBean>
{
private long myValue;
public MyBean(Long value) { this.myValue = value; }
// Other helper methods and overrides
public MyBean valueOf(Long data)
{
return new MyBean(data);
}
@Override
public String toString()
{
return String.valueOf(myValue);
}
}
这就是我使用它的方式:
@Entity
@Table(name = "mybeans")
public class MyBean implements Serializable
{
private static final long serialVersionUID = 1L;
MyBean myBean;
@Id
@Column(name = "mybean", nullable = false)
public MyBean getMyBean() { return myBean; }
public void setMyBean(MyBean value) { this.myBean = value; }
}
反序列化此对象调用toString并正常工作(jax-rs / jersey)。但是当我尝试使用我的EJB将其从数据库中取出时,我得到的错误是:
类[类java.lang.Long]的对象[1,427,148,028,955]可以 不能转换为[com.MyBean]
保存它会产生错误
无法推断用于com.MyBean实例的SQL类型。使用 setObject()带有显式的Types值,用于指定要使用的类型。
这是有道理的。
但是我可以将哪些方法添加到男性EJB中获取long值作为值并使用long来设置新对象?
解答:
使类@Embeddable并添加以下属性。
@Embedded
@AttributeOverrides({
@AttributeOverride(name="value", column=@Column(name="mybean"))
})
(我没有添加EmbeddedId,因为我添加了一个串行主键ID,只是将其设为一列)
唯一需要注意的是,它不适用于动态编织。我不得不添加
<property name="eclipselink.weaving" value="static"/>
到我的persistence.xml
答案 0 :(得分:1)
您可以尝试MyBean
Embeddable将其用作EmbeddedId,如下所示:
@Embeddable
public final class MyBean extends Number implements Serializable, Comparable<MyBean> {
private Long myValue;
public MyBean(Long myValue) {
this.myValue = myValue;
}
// Other helper methods and overrides
public MyBean valueOf(Long data) {
return new MyBean(data);
}
@Override
public String toString() {
return String.valueOf(myValue);
}
}
在您的实体中,MyBean
将是EmbeddedId,并且如下所示:
@Entity
@Table(name = "mybeans")
public class MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
private MyBean myBean;
@EmbeddedId
@AttributeOverride(name="myValue", @Column(name="mybean_id"))
public MyBean getMyBean() {
return myBean;
}
public void setMyBean(MyBean myBean) {
this.myBean = myBean;
}
}
根据需要调整MyBean
,例如将Transient
设置为某些属性。