2016-08-18 7 views
0

У меня есть сущность с двумя классами Embedded того же типа, и у кого есть ElementCollection того же типа два. Бизнес-логика, по-видимому, правильная, но я испытываю некоторые проблемы с недостатком знаний в JPA, я думаю.jpa - Несколько элементов @ElementCollection в двух разных классах @Embeddable

Давайте проверим мои классы:

@Entity 
public class Etapa extends EntidadeBase { 

    @Embedded 
    private CronogramaDeDesembolso cronogramaDeReceita; 

    @Embedded 
    private CronogramaDeDesembolso cronogramaDeDespesa; 
} 

@Embeddable 
public class CronogramaDeDesembolso { 

    @ElementCollection 
    private List<Parcela> parcelas; 
} 

Я получаю следующее журнал ошибок.

вызвано следующими причинами: org.hibernate.HibernateException: Найдено общие ссылки к коллекции: nexxus.convenioestadual.dominio.planodetrabalho.etapa.Etapa.cronogramaDeReceita.parcelas

ли вы, ребята, есть какие-либо подскажите, что не так, и как я могу это исправить?

EDIT:

Due комментарии я сделал это изменение, и он не работал слишком

@Entity 
public class Etapa extends EntidadeBase { 

    @Embedded 
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasReceita")) 
    private CronogramaDeDesembolso cronogramaDeReceita; 

    @Embedded 
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDespesa")) 
    private CronogramaDeDesembolso cronogramaDeDespesa; 
} 

ответ

0

Быстрый поиск в Google появился этот в StackOverflow:

JPA Multiple Embedded fields

Казалось бы, вам нужно сделать некоторую явную аннотацию, переопределяющую поля wi тонкий вложимый класс. В связанном ответе есть примеры кода, которые должны дать вам хорошее представление о том, куда идти.

Приветствие,

+0

я уже пробовал тот же пост и сделал '@AttributeOverride (имя =«Parcelas», столбец = @column (имя =«parcelasDespesa»))' но не изменить имя атрибута _parcelas_ и ошибки persists – higornucci

+0

Вы использовали эту строку кода для каждого из встроенных объектов? Я считаю, что им действительно нужно ссылаться на разные физические столбцы в базе данных. Так что вам нужно будет выглядеть примерно так (при условии, что я это правильно понимаю): '@ Embedded' ' @AttributeOverride (name = "parcelas", column = @Column (name = "parcelasDeReceita")) ' 'частное CronogramaDeDesembolso cronogramaDeReceita;' ' @ Embedded' ' @AttributeOverride (имя = "Parcelas", столбец = @Column (имя = "parcelasDespesa")) '' частной CronogramaDeDesembolso cronogramaDeDespesa; ' –

+0

Я сделал изменения, предложенные и он все еще не работает = [ – higornucci

1

Есть ли причина, почему вы решили использовать эту структуру? Как правило, при преобразовании объекта в СУБД вам необходимо смоделировать отношения. Когда вы используете вложенный, он добавит столбец (или столбцы), связанный с ним, в таблицу. Поэтому, когда вы делаете это обычно (а не коллекции), все в порядке.

Когда вы делаете коллекцию, она сталкивается с проблемами. В основном нет возможности представлять коллекцию в одной строке (так как это сущность, которую вы могли бы иметь многие из них настолько эффективно для каждого объекта, у вас есть только одна строка) & один столбец. Поэтому, когда вы представляете коллекцию, на самом деле вам нужно иметь вторую таблицу со столбцом, ссылающимся на нее назад. На самом деле это противоположное мышление о нормальном объекте. Записи коллекции должны знать, с какой коллекцией они были связаны, вместо того, чтобы сборник знал свои записи.

Так что в какой-то POJO вы могли бы и эти ....

MyListObject { 
    //Some implementation of things you want to collect 
} 


MyClass { 
    List<MyListObject> myListObject; 
} 

Но эта модель в JPA вы должны иметь это представлено двумя таблицами.

Ваш объект, который будет в списке.

@Entity 
MyListObject { 

    @ManyToOne 
    @JoinColumn(name = "MY_CLASS_KEY") 
    private MyClass myClass; 
} 

Ваш объект/объект, который будет иметь список.

@Entity 
MyClass { 

    @Id 
    @Column(name = "MY_CLASS_KEY") 
    private Long myClassKey; 

    @OneToMany(mappedBy = "myClass") 
    private List<MyListObject> myString; 
} 

Надеюсь, это поможет.

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