2013-11-14 3 views
3

Есть ли способ, чтобы переназначить @Id в дочерней сущности после того, как он был назначен на некоторое поле в родительской сущностиHibernate/JPA: Можно ли переопределить поле @Id?

Например:

@MappedSuperclass 
@Access(AccessType.FIELD) 
public abstract class Parent implements Serializable { 

    @Id 
    protected Integer parentId; 

    public Integer getId() { 
    return parentId; 
    } 

    public void setId(Integer id) { 
    this.id = parentId; 
    } 
} 


@Entity 
@Access(AccessType.FIELD) 
public class Child extends Parent implements Serializable { 

    /* 
    What should be added to this entity to re assign the @Id to a new field and 
    make the parentId field just an ordianry field in the Child, not the entity Id 
    */ 
    @Id 
    private Long childId; 

} 

Я попытался использовать @AttributeOverride, но все это может обеспечить это переименование имени столбца id.

+3

Я думаю, что это невозможно. Как это следует сопоставить с RDB? Это, безусловно, невозможно для «Единой таблицы для каждой иерархии» и «Таблица для каждого подкласса». Зачем вам эта функция? (Btw: Почему ваш дочерний подкласс Parent?) – isnot2bad

+0

@ isnot2bad У меня есть общий объект, который обертывает id, версию и некоторые другие поля, которые разделяются между множеством сущностей. и приложение уже построено с учетом общей сущности. но для некоторых новых объектов, которые используют одни и те же поля, кроме типа и имени поля Id. Однако они все еще сохраняют старый столбец Идентификатор, но как обычное поле. – fujy

ответ

0

вы можете переопределить метаданные аннотации по xml: для спящего режима см. Например. this post

для общего JPA см., Например, this post

4

Это звучит как проблема с дизайном.

Правильный путь для достижения этой цели, вероятно, определить другой класс: @MappedSuperclass GenericEntity со всеми атрибутами Parent кроме parentId:

@MappedSuperclass 
@Access(AccessType.FIELD) 
public abstract class GenericEntity implements Serializable { 
    ... all your common attributes without parentId 
} 

@MappedSuperclass 
public abstract class Parent extends GenericEntity implements Serializable { 

    @Id 
    protected Integer parentId; 

    public Integer getId() { 
     return parentId; 
    } 

    public void setId(Integer id) { 
     this.id = parentId; 
    } 

    //nothing more in this class 
} 

@Entity 
public class Child extends GenericEntity implements Serializable { 

    @Id 
    private Long childId; 

    private Integer parentId; //if you need it 

    ... 
}  

Альтернативное экспериментальное решение может быть, чтобы скрыть parentId поле в Child класс.

Отказ от ответственности: Я не рекомендую этот подход, и я не уверен, что он сработает!

@Entity 
@Access(AccessType.FIELD) 
public class Child extends GenericEntity implements Serializable { 

    @Id 
    private Long childId; 

    private Integer parentId; 

    ... 
}  
+0

. Второе решение добавит два идентификатора для ребенка, исключение было отправлено в другие сущности, ссылающиеся на дочерние объекты, указывающие, что я должен назначить TWO столбцы для внешнего ключа – fujy

+0

И для первое решение это вызовет рефакторинг во многих сущностях. В любом случае, спасибо за это, но это не решает мой главный вопрос, если можно переназначить Id или нет? – fujy

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