OneToMany does not load
mikedougherty Feb 16, 2007 4:13 PMI have a couple Entities that have @OneToMany relationships with each other. I define them as so..
@Entity public class District implements Serializable { private Long id; private String name; private Region region; private Manager manager; @DataModel private List<Store> stores; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Length(max=150) public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToOne @JoinColumn(name="region_id", nullable=false) public Region getRegion() { return region; } public void setRegion(Region region) { this.region = region; } @OneToOne @JoinColumn(name="manager_id", nullable=false) public Manager getManager() { return manager; } public void setManager(Manager manager) { this.manager = manager; } @OneToMany(cascade=ALL, mappedBy="id", fetch=EAGER) public List<Store> getStores() { return stores; } public void setStores(List<Store> stores) { this.stores = stores; } }
@Entity public class Store implements Serializable { private Long id; private String name; private String street; private String city; private String state; private String postalCode; private District district; @Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Length(max=20) public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Column(name="postal_code") public String getPostalCode() { return postalCode; } public void setPostalCode(String postalCode) { this.postalCode = postalCode; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @ManyToOne(optional=false, fetch=EAGER) @JoinColumn(name="district_id", nullable=false) public District getDistrict() { return district; } public void setDistrict(District district) { this.district = district; } }
The relationship definition seems to work fine because when I create a Store it maintains the proper District relationship in the database.
mysql> select * from District; +----+-----------+-----------+------------+ | id | name | region_id | manager_id | +----+-----------+-----------+------------+ | 1 | district1 | 1 | 1 | +----+-----------+-----------+------------+
mysql> select * from Store; +----+--------+---------------+------+-------+-------------+-------------+ | id | name | street | city | state | postal_code | district_id | +----+--------+---------------+------+-------+-------------+-------------+ | 1 | store1 | 123 my street | city | st | 12345 | 1 | | 2 | store2 | 456 my street | city | st | 12345 | 1 | +----+--------+---------------+------+-------+-------------+-------------+
However, when I try to load this District I am getting very odd behavior. With the @GeneratedValue annotations (as above) the following DataTable only shows Store "store1".
<h:dataTable var="store" value="#{districtHome.instance.stores}" rendered="#{ not empty districtHome.instance.stores }" id="stores"> <h:column> <f:facet name="header">Name</f:facet> <h:outputText value="#{store.name}"/> </h:column> </h:dataTable>
In reality I do not want @GeneratedValue's for the Id field. But when I remove the @GeneratedValue annotation and input the Id's via the form I get no results in the <h:dataTable /> at all.
Nothing I have tried seems to be getting me anywhere. I've tried using that dataTable and not. I've tried using Set's and List's. I've tried it with the following in the DistrictHome.java:
public List<Store> getStores() { return getInstance() == null || getInstance().getStores() == null ? null : new ArrayList<Store>(getInstance().getStores()); }
And...
<h:dataTable var="store" value="#{districtHome.stores}" rendered="#{ not empty districtHome.stores }" id="stores"> <h:column> <f:facet name="header">Name</f:facet> <h:outputText value="#{store.name}"/> </h:column> </h:dataTable>
All of which either give me no items in the stores Collection, or only one (when I expect two). I've gone through the examples (which is where I got the DistrictHome idea) and can not seem to find any differences (that solve the problem) between my code and the example code. I am at a complete loss at this point.
Where or how can I debug this to find out what the problem is and fix it? Any thoughts at all on what might be causing the problem?
Thanks.