如何进行自定义EJB / JPA映射类型?

时间:2015-03-23 22:34:33

标签: java jpa eclipselink

我想将一个属性作为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

1 个答案:

答案 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设置为某些属性。