[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3425) @IndexColumn doesn't store the List index

J (JIRA) noreply at atlassian.com
Sat Aug 9 12:19:30 EDT 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3425?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_30819 ] 

J commented on HHH-3425:
------------------------

Solved. Problem is not a bug.

I was using the inverse/mappedby side, which won't update the position. So I had to use the collection side, and use the position property instead. (Or I could remove the mappedBy, and use the List instead.)

This issue can be closed.

> @IndexColumn doesn't store the List index
> -----------------------------------------
>
>                 Key: HHH-3425
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3425
>             Project: Hibernate3
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.2.6
>         Environment: Hibernate: 3.2.6.ga, hibernate-annotations-3.3.0.GA, MySQL: 5.0.51b-community-nt
>            Reporter: J
>            Priority: Minor
>
> When you have a Parent class with a bidirectional one-to-many relation to a Child class (as a List), and the index column is mapped as a property in the associated entity, Hibernate will not store the index position of the List in the db. The value will stay 0 or null (depending whether you use int of Integer as index type).
> Example taken directly from 2.4.6.2.3: http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#entity-hibspec-collection-extratype-indexbidir
> With small change, for example "order" is changed to "position", because "order" is not allowed as columnname in MySQL.
> ------------ PARENT --------------
> package entities; 
> import java.util.ArrayList; 
> import java.util.List; 
> import javax.persistence.Entity; 
> import javax.persistence.GeneratedValue; 
> import javax.persistence.Id; 
> import javax.persistence.OneToMany; 
> @Entity 
> public class Parent { 
>     // Properties 
>     @Id @GeneratedValue 
>     private Long id; 
>     @OneToMany(mappedBy="parent") 
>     @org.hibernate.annotations.IndexColumn(name="position") 
>     private List<Child> children = new ArrayList<Child>(); 
>     private String name; 
>     // Getters & Setters 
>     public List<Child> getChildren() { return children; } 
>     public void setChildren(List<Child> children) { this.children = children; } 
>     public String getName() { return name; } 
>     public void setName(String name) { this.name = name; } 
>     public Parent() {} 
> } 
> ------------------
> ----- CHILD -----
> package entities; 
> import javax.persistence.Column; 
> import javax.persistence.Entity; 
> import javax.persistence.GeneratedValue; 
> import javax.persistence.Id; 
> import javax.persistence.JoinColumn; 
> import javax.persistence.ManyToOne; 
> import org.hibernate.Session; 
> import persistence.HibernateUtil; 
> @Entity 
> public class Child { 
>    // Properties 
>     @Id @GeneratedValue 
>     private Long id; 
>     @Column(name="position") 
>     private int position; 
>     @ManyToOne 
>     @JoinColumn(name="parent_id", nullable=false) 
>     private Parent parent; 
>     
>     private String name; 
>     // Getters & Setters 
>     public Parent getParent() { return parent; } 
>     public void setParent(Parent parent) { this.parent = parent; } 
>     public String getName() { return name; } 
>     public void setName(String name) { this.name = name; } 
> } 
> ------------------------------------
> ------ TEST --------------
>        Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
>        session.beginTransaction(); 
>         
>        Parent parent = new Parent(); 
>        Child child1 = new Child(); 
>        parent.getChildren().add(child1); 
>        child1.setParent(parent); 
>        Child child2 = new Child(); 
>        parent.getChildren().add(child2); 
>        child2.setParent(parent); 
>         
>        session.save(parent); 
>        session.save(child1); 
>        session.save(child2); 
>         
>        session.getTransaction().commit(); 
> --------------------------
> After running this, the DB will stay:
> mysql> select * from child; 
> +----+------+----------+-----------+ 
> | id | name | position | parent_id | 
> +----+------+----------+-----------+ 
> |  1 | NULL |     NULL |         1 | 
> |  2 | NULL |     NULL |         1 | 
> +----+------+----------+-----------+
> instead of:
> mysql> select * from child; 
> +----+------+----------+-----------+ 
> | id | name | position | parent_id | 
> +----+------+----------+-----------+ 
> |  1 | NULL |        1 |         1 | 
> |  2 | NULL |        2 |         1 | 
> +----+------+----------+-----------+
> See also:
> http://forum.hibernate.org/viewtopic.php?p=2392563

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list