2015-03-23 3 views
1

Я хочу сохранить свойство в базе данных как Long, но использовать объект со вспомогательными методами в коде.Как создать настраиваемый тип отображения EJB/JPA?

Однако тип объекта - это настраиваемый тип, который имеет внутреннее значение (длинное), которое я хочу сохранить в базе данных.

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/Джерси). Но когда я пытаюсь вытащить его из базы данных, используя мой EJB, ошибка я получаю:

Объект [1.427.148.028.955] класса [класс java.lang.Long], может не быть преобразован в [класс com.MyBean]

Сохранение он произвел ошибку

не удается определить тип SQL, используемый для экземпляра com.MyBean. Используйте setObject() с явным значением типа, чтобы указать тип использования.

Это имеет смысл.

Но какие методы я могу добавить к мужчине, EJB получить длинный, как значение, и использовать длинный, чтобы создать новый объект?

ОТВЕТ:

Создание класса @Embeddable и добавив следующие атрибуты работали.

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="value", [email protected](name="mybean")) 
}) 

(я не добавлял EmbeddedId, потому что я добавил серийный первичный идентификатор ключа и только что сделал это столбец)

Одно предостережение в том, что она не будет работать с динамическим ткачества. Я должен был добавить

<property name="eclipselink.weaving" value="static"/> 

моему persistence.xml

ответ

1

Вы можете попробовать сделать MyBeanEmbeddable использовать это в качестве 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 некоторые атрибуты.

+0

Удивительный! Прекрасно работает. Благодарю. Одно из предостережений в том, что мне пришлось включить Static weaving для EclipseLink. Это не понравилось динамическое ткачество. –

Смежные вопросы