Использование @IndexColumn приводит к seq_num 0 - PullRequest
2 голосов
/ 29 октября 2010

Я хотел бы использовать @IndexColumn, чтобы установить порядковый номер некоторых данных, которые вводит пользователь. Я использую Spring 2.5.6, JBoss 5.1 (JPA 1.0).

Для моего родительского класса

@Entity
@Table(name="material")
public class Material implements Serializable {
.
.
    /**
     * List of material attributes associated with the given material
     */
    @OneToMany(mappedBy = "material", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @IndexColumn(name="seq_number", base=0, nullable = false)
    private List<MaterialAttribute> materialAttributes;

    public void addMaterialAttribute(List<MaterialAttribute> attribs)
    {
        if(CollectionUtils.isNotEmpty(attribs))
        {
            for(MaterialAttribute attrib : attribs)
            {
                attrib.setMaterial(this);
            }

            this.setMaterialAttributes(attribs);
        }
    }

}

Для моего детского класса

@Entity
@Table(name="material_attribute")
public class MaterialAttribute implements Serializable
{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "material_id", referencedColumnName = "id", updatable=false, nullable = true, unique = false)
    private Material material;

    @Column(name = "seq_number", insertable=false, updatable=false, nullable = false)
    private int seqNumber;
}

Для класса обслуживания

public void save(MaterialCommand pCmd)
{
    Material material = new Material(pCmd.getName());

    //convert from command object to entity object
    List<MaterialAttribute> attribs = new ArrayList<MaterialAttribute>();

    if(CollectionUtils.isNotEmpty(pCmd.getAttribs()))
    {
        Iterator<MaterialAttributeCommand> iter = pCmd.getAttribs().iterator();
        while(iter.hasNext())
        {
            MaterialAttributeCommand attribCmd = (MaterialAttributeCommand) iter.next();

            MaterialAttribute attrib = new MaterialAttribute();
            attrib.setDisplayName(attribCmd.getDisplayName());
            attrib.setValidationType(attribCmd.getValidationType());

            attribs.add(attrib);
        }
    }

    material.addMaterialAttribute(attribs);

    this.getMaterialDAO().saveMaterial(material);
}

Я получаю записи в базе данных, но seq_number всегда равен нулю для каждого элемента в коллекции.

Я должен предположить, что это способ сохранения данных, но я просто не вижу его.


Я смог решить проблему, выполнив следующее (удалил mappedBy):

@Entity
@Table(name="material")
public class Material implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 5083931681636496023L;

    @Column(name="name", length=50, nullable=false)
    private String mName;

    /**
     * List of material attributes associated with the given material
     */
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @IndexColumn(name="seq_number", base=0)
    @JoinColumn(name="material_id",nullable=false)
    private List<MaterialAttribute> materialAttributes;



@Entity
@Table(name="material_attribute")
public class MaterialAttribute implements Serializable
{

    /**
     * 
     */
    private static final long serialVersionUID = -196083650806575093L;

    /**
     * identifies the material that these attributes are associated with
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "material_id", insertable=false, updatable=false, nullable = true, unique = false)
    private Material material;

    @Column(name = "seq_number", insertable=false, updatable=false)
    private int seqNumber;

1 Ответ

4 голосов
/ 30 октября 2010

Отображение двунаправленного индексированного списка с помощью Hibernate немного сложнее, но рассматривается в разделе 2.4.6.2.1. Двунаправленная ассоциация с проиндексированными коллекциями документации (жирный шрифт):

2.4.6.2.1. Двунаправленная ассоциация с индексированными коллекциями

Двунаправленная ассоциация, в которой один end - это индексированная коллекция (т.е. представлен как @OrderColumn или как Map) требует специального рассмотрение. Если недвижимость на связанный класс явно отображает индексированное значение, использование mappedBy разрешено :

@Entity
public class Parent {
    @OneToMany(mappedBy="parent")
    @OrderColumn(name="order")
    private List<Child> children;
    ...
}

@Entity
public class Child {
    ...
    //the index column is mapped as a property in the associated entity
    @Column(name="order")
    private int order;

    @ManyToOne
    @JoinColumn(name="parent_id", nullable=false)
    private Parent parent;
    ...
}

Но, если на детский класс, мы не можем думать о ассоциация как истинно двунаправленный (есть информация доступны на одном конце ассоциация, которая недоступна в другой конец: указатель). В этом случай, мы не можем отобразить коллекцию как mappedBy. Вместо этого мы могли бы использовать следующее отображение:

@Entity
public class Parent {
    @OneToMany
    @OrderColumn(name="order")
    @JoinColumn(name="parent_id", nullable=false)
    private List<Child> children;
    ...
}

@Entity    
public class Child {    
    ...
    @ManyToOne
    @JoinColumn(name="parent_id", insertable=false, updatable=false, nullable=false)
    private Parent parent;
    ...
}

Обратите внимание, что в этом отображении ценный конец Ассоциация несет ответственность за обновление внешнего ключа .

На самом деле, второе отображение - это именно то, как сопоставить двунаправленную единицу со многими со стороной один ко многим в качестве стороны-владельца . Хотя это возможно, вы должны знать, что такое отображение будет производиться при оптимизированном SQL, как указано в разделе о 2.2.5.3.1.1. Двунаправленные отношения [один-ко-многим]:

Чтобы отобразить двунаправленную связь со многими, со стороной один ко многим, как владеть стороной, вы должны удалить mappedBy элемент и установите многие в один @JoinColumn как insertable и updatable до false. Это решение не оптимизирован и будет производить некоторые дополнительные операторы ОБНОВЛЕНИЯ.

Подводя итог, если сопоставление столбца индекса как свойства целевого объекта не является проблемой, это будет моей рекомендацией (т.е. первое сопоставление).

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...