Note that there are some explanatory texts on larger screens.

plurals
  1. POBeanCreationException after adding two variables
    primarykey
    data
    text
    <p>Can someone show me how to get past a BeanCreationException? </p> <p>I am getting a BeanCreationException after adding two variables to <a href="https://github.com/spring-projects/spring-petclinic/blob/master/src/main/java/org/springframework/samples/petclinic/model/Owner.java" rel="nofollow">Owner.java</a> as follows: </p> <pre><code>@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; pets; //I added the following two variable declarations @Transient private Set&lt;Pet&gt; cats = new HashSet&lt;Pet&gt;(); @Transient private Set&lt;Pet&gt; dogs = new HashSet&lt;Pet&gt;(); </code></pre> <p>I also added getter and setter methods for cats and dogs, along with a method for populating cats and dogs as subsets of pets as follows: </p> <pre><code>public void parsePets() { for (Pet pet : getPetsInternal()) { if (pet.getType().getName().equals("cat")) {cats.add(pet);} else if (pet.getType().getName().equals("dog")) {dogs.add(pet);} } } protected Set&lt;Pet&gt; getPetsInternal() { if (this.pets == null) {this.pets = new HashSet&lt;Pet&gt;();} return this.pets; } </code></pre> <p>The application is failing to initialize when I do Run As...Run on Server within eclipse, and is giving the following error message: </p> <pre><code>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [spring/business-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/business-config.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: petclinic] Unable to build EntityManagerFactory ... Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: owners, for columns: [org.hibernate.mapping.Column(cats)] </code></pre> <p>Here is <a href="https://github.com/spring-projects/spring-petclinic/blob/master/src/main/resources/spring/business-config.xml" rel="nofollow">the code for business-config.xml</a>. </p> <p>I can eliminate the error message and get the application to run by commenting out the changes, but then I am left with the problem that the three lists (pets, cats, dogs) are identical, when I need cats and dogs to each be different subsets of pets. Here is the code which eliminates the error message but creates three identical lists which should not be identical: </p> <pre><code>@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; pets; //I added next two variables // @Transient @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; cats;// = new HashSet&lt;Pet&gt;(); // @Transient @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; dogs;// = new HashSet&lt;Pet&gt;(); </code></pre> <p>Per axiopisty's request, I cannot really comment out everything except the addition of cats and dogs because pets, cats and dogs are called from OwnerController.java as follows: </p> <pre><code>@RequestMapping(value = "/owners", method = RequestMethod.GET) public String processFindForm(@RequestParam("ownerID") String ownerId, Owner owner, BindingResult result, Map&lt;String, Object&gt; model) { Collection&lt;Owner&gt; results = this.clinicService.findOwnerByLastName(""); model.put("selections", results); int ownrId = Integer.parseInt(ownerId); Owner sel_owner = this.clinicService.findOwnerById(ownrId);//jim added this sel_owner.parsePets(); model.put("sel_owner",sel_owner); return "owners/ownersList"; } </code></pre> <hr> <h2>EDIT:</h2> <p>As per Sotirios' request, here is my entity class, Owner.java: </p> <pre><code>@Entity @Table(name = "owners") public class Owner extends Person { @Column(name = "address") @NotEmpty private String address; @Column(name = "city") @NotEmpty private String city; @Column(name = "telephone") @NotEmpty @Digits(fraction = 0, integer = 10) private String telephone; @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; pets; //I added next two variables @Transient @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; cats = new HashSet&lt;Pet&gt;(); @Transient @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch=FetchType.EAGER) private Set&lt;Pet&gt; dogs = new HashSet&lt;Pet&gt;(); //end of 2 variables I added public String getAddress() {return this.address;} public void setAddress(String address) {this.address = address;} public String getCity() {return this.city;} public void setCity(String city) {this.city = city;} public String getTelephone() {return this.telephone;} public void setTelephone(String telephone) {this.telephone = telephone;} protected void setPetsInternal(Set&lt;Pet&gt; pets) {this.pets = pets;} // Call this from OwnerController before returning data to page. public void parsePets() { for (Pet pet : getPetsInternal()) { if (pet.getType().getName().equals("cat")) { cats.add(pet); System.out.println(pet.getType().getName()); System.out.println("cats.size() is: "+cats.size()); System.out.println("added a cat to cats"); } else if (pet.getType().getName().equals("dog")) { dogs.add(pet); System.out.println(pet.getType().getName()); System.out.println("dogs.size() is: "+dogs.size()); System.out.println("added a dog to dogs"); } // add as many as you want System.out.println("----------------------------------------------"); } } public Set&lt;Pet&gt; getCats() { System.out.println("about to return cats"); for (Pet cat : cats) {System.out.println("counting a "+cat.getType()+" in cats.");} System.out.println("cats.size() is: "+cats.size()); return cats; } public Set&lt;Pet&gt; getDogs() { System.out.println("about to return dogs"); for (Pet dog : dogs) {System.out.println("counting a "+dog.getType()+" in dogs.");} System.out.println("dogs.size() is: "+dogs.size()); return dogs; } //end section I added protected Set&lt;Pet&gt; getPetsInternal() { if (this.pets == null) {this.pets = new HashSet&lt;Pet&gt;();} return this.pets; } public List&lt;Pet&gt; getPets() { List&lt;Pet&gt; sortedPets = new ArrayList&lt;Pet&gt;(getPetsInternal()); PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true)); return Collections.unmodifiableList(sortedPets); } public void addPet(Pet pet) { getPetsInternal().add(pet); pet.setOwner(this); } public Pet getPet(String name) {return getPet(name, false);} public Pet getPet(String name, boolean ignoreNew) { name = name.toLowerCase(); for (Pet pet : getPetsInternal()) { if (!ignoreNew || !pet.isNew()) { String compName = pet.getName(); compName = compName.toLowerCase(); if (compName.equals(name)) { return pet; } } } return null; } @Override public String toString() { return new ToStringCreator(this) .append("id", this.getId()) .append("new", this.isNew()) .append("lastName", this.getLastName()) .append("firstName", this.getFirstName()) .append("address", this.address) .append("city", this.city) .append("telephone", this.telephone) .toString(); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload