That's rigth Bryan, i've got the same effect - sql generated in hibernate
returns duplicate rows with identical ids.

Do you know how to run in debug mode appfuse 2 from intellij?


Bryan Noll wrote:
> 
> OK... so I accidentally stopped short of actually addressing your 
> issue.  So, I added another test as follows:
> 
>     public void testGetAllUsers() throws Exception {
>     System.out.println("##### testGetAllUsers #####");
>     super.assertEquals(2, dao.getAll().size());
>     }
> 
> ...and I'm having the same issue.  I'll have to look some more to figure 
> out what's going on. 
> 
> Hibernate generates this SQL for the example I gave, which returns 4 
> rows, and I only have to app_user's in the table.
> 
> SELECT THIS_.ID AS ID0_2_,
>        THIS_.ADDRESS AS ADDRESS0_2_,
>        THIS_.COUNTRY AS COUNTRY0_2_,
>        THIS_.CITY AS CITY0_2_,
>        THIS_.PROVINCE AS PROVINCE0_2_,
>        THIS_.POSTAL_CODE AS POSTAL6_0_2_,
>        THIS_.VERSION AS VERSION0_2_,
>        THIS_.ACCOUNT_ENABLED AS ACCOUNT8_0_2_,
>        THIS_.USERNAME AS USERNAME0_2_,
>        THIS_.PASSWORD AS PASSWORD0_2_,
>        THIS_.PASSWORD_HINT AS PASSWORD11_0_2_,
>        THIS_.FIRST_NAME AS FIRST12_0_2_,
>        THIS_.LAST_NAME AS LAST13_0_2_,
>        THIS_.EMAIL AS EMAIL0_2_,
>        THIS_.PHONE_NUMBER AS PHONE15_0_2_,
>        THIS_.WEBSITE AS WEBSITE0_2_,
>        THIS_.ACCOUNT_EXPIRED AS ACCOUNT17_0_2_,
>        THIS_.ACCOUNT_LOCKED AS ACCOUNT18_0_2_,
>        THIS_.CREDENTIALS_EXPIRED AS CREDENT19_0_2_,
>        ROLES2_.USER_ID AS USER1_4_,
>        ROLE3_.ID AS ROLE2_4_,
>        ROLE3_.ID AS ID1_0_,
>        ROLE3_.NAME AS NAME1_0_,
>        ROLE3_.DESCRIPTION AS DESCRIPT3_1_0_,
>        NICKNAMES4_.USER_ID_REF AS USER4_5_,
>        NICKNAMES4_.ID AS ID5_,
>        NICKNAMES4_.ID AS ID2_1_,
>        NICKNAMES4_.NAME AS NAME2_1_,
>        NICKNAMES4_.STORYBEHINDNAME AS STORYBEH3_2_1_,
>        NICKNAMES4_.USER_ID_REF AS USER4_2_1_
> FROM   APP_USER THIS_
>        LEFT OUTER JOIN USER_ROLE ROLES2_
>          ON THIS_.ID = ROLES2_.USER_ID
>        LEFT OUTER JOIN ROLE ROLE3_
>          ON ROLES2_.ROLE_ID = ROLE3_.ID
>        LEFT OUTER JOIN NICKNAMES NICKNAMES4_
>          ON THIS_.ID = NICKNAMES4_.USER_ID_REF
> 
> 
> 
> Bryan Noll wrote:
>> OK... so it might help to see the code from your 
>> GenericSearchDaoHibernate class, but I it works just fine for me with 
>> the following:
>>
>> Assuming you checked out from the following (which by the way, the 
>> suggested way for using appfuse 2 is not to use the code directly as 
>> you did with appfuse 1, but do use an archetype, and depend on appfuse 
>> in your pom.xml) :
>>
>> https://appfuse.dev.java.net/svn/appfuse/trunk/
>>
>> 1)
>>
>> Add this to your User class in /data/common
>>
>>    protected Set<Nickname> nickNames = null;
>>      @OneToMany(mappedBy="user", cascade=CascadeType.ALL, 
>> fetch=FetchType.EAGER)
>>    public Set<Nickname> getNickNames() {
>>        return nickNames;
>>    }
>>
>>    public void setNickNames(Set<Nickname> nickNames) {
>>        this.nickNames = nickNames;
>>    }
>>
>>
>> 2) Create the Nickname class in /data/common (file attached)
>>
>> 3) Add the following to 
>> /data/hibernate/src/test/resources/hibernate.cfg.xml
>>
>> <mapping class="org.appfuse.model.Nickname"/>
>>
>> 4) Add the test src/test/java/org/appfuse/dao/UserNicknameDaoTest.java 
>> (file attached) to /data/hibernate
>>
>> Notice here that I didn't create a new dao or method or anything.  
>> Simply used the GenericDao that is already configured for the User 
>> class, and by virtue of the fact that we mapped nicknames with an 
>> EAGER fetch type, the 'get' works for us.
>>
>> 5) Run mvn:install from /data/common
>>
>> 6) Run mvn:test from /data/hibernate - this should create your 
>> nicknames table
>>
>> 7) Insert 3 rows into the nicknames table that refer to user with id 
>> of 1 (more or less than 3 and the test will not pass)
>>
>> 8) Run 'mvn -Dtest=UserNicknameDaoTest' from /data/hibernate - the 
>> test should pass and you should see something like this from the 
>> println's
>>
>> The story behind 'Country Bry' is : 'Sean and Raible put their heads 
>> together for this one.'
>> The story behind 'Country' is : 'Hef shortened Country Bry to this.'
>> The story behind 'Meat' is : 'Filios gave me this one.'
>>
>>
>>
>> Let me know if something doesn't work.
>>
>>
>>
>> ros wrote:
>>> (Appguse2 Hibernate)
>>> I've added OneToMany relation with FetchType.EAGER from User pojo to 
>>> Test
>>> pojo.
>>> Now GenericDaoHibernate getAll returns 5 users, but in database there 
>>> are 2
>>> users - one amin user and one tomcat user, tomcat user has relation to 4
>>> Test pojos.
>>> Can getAll return distinct selection of users?
>>>
>>>
>>>
>>>
>>> @Entity
>>> @Table(name="app_user")
>>> public class User extends BaseObject implements Serializable, 
>>> UserDetails {
>>> ...
>>>     protected Set<Test> tests = new HashSet<Test>();
>>> ...
>>>     @OneToMany(targetEntity=Test.class, cascade=CascadeType.ALL,
>>> mappedBy="user", fetch = FetchType.EAGER)
>>>     public Set<Test> getTests() {
>>>         return testss;
>>>     }
>>> ...
>>> }
>>>
>>> test:
>>>
>>> GenericSearchDaoHibernate<User, Long> searchDao = new
>>> GenericSearchDaoHibernate(User.class);
>>> searchDao.setSessionFactory((SessionFactory)
>>> applicationContext.getBean("sessionFactory"));
>>> List<User> users = searchDao.getAll(); 
>>> System.out.println(users.toString());
>>>
>>> output:
>>> [EMAIL 
>>> PROTECTED],enabled=true,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted
>>>  
>>>
>>> Authorities: ,user],
>>> [EMAIL 
>>> PROTECTED],enabled=true,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted
>>>  
>>>
>>> Authorities: ,user],
>>> [EMAIL 
>>> PROTECTED],enabled=true,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted
>>>  
>>>
>>> Authorities: ,user],
>>> [EMAIL 
>>> PROTECTED],enabled=true,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted
>>>  
>>>
>>> Authorities: ,user],
>>> [EMAIL 
>>> PROTECTED],enabled=true,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted
>>>  
>>>
>>> Authorities: ,admin]]
>>>
>>>
>>> If relation is FetchType.LAZY then no duplicate users, but I need to 
>>> load
>>> Test pojos with user.
>>>   
>> ------------------------------------------------------------------------
>>
>> package org.appfuse.model;
>>
>> import javax.persistence.CascadeType;
>> import javax.persistence.Column;
>> import javax.persistence.Entity;
>> import javax.persistence.GeneratedValue;
>> import javax.persistence.GenerationType;
>> import javax.persistence.Id;
>> import javax.persistence.JoinColumn;
>> import javax.persistence.ManyToOne;
>> import javax.persistence.Table;
>>
>> import org.apache.commons.lang.builder.EqualsBuilder;
>> import org.apache.commons.lang.builder.HashCodeBuilder;
>> import org.apache.commons.lang.builder.ToStringBuilder;
>>
>> @Entity
>> @Table(name="nicknames")
>> public class Nickname extends BaseObject {
>>     
>>     protected Long id;    
>>     protected String name;
>>     protected String storyBehindName;        
>>     protected User user;
>>     
>>     @Id  @GeneratedValue(strategy=GenerationType.AUTO)
>>     public Long getId() {
>>         return id;
>>     }
>>     
>>     @Column(length=30)
>>     public String getName() {
>>         return name;
>>     }
>>     
>>     @Column(length=400)
>>     public String getStoryBehindName() {
>>         return storyBehindName;
>>     }
>>     
>>     @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="user_id_ref")
>>     public User getUser() {
>>         return user;
>>     }
>>     public void setId(Long id) {
>>         this.id = id;
>>     }
>>     public void setName(String name) {
>>         this.name = name;
>>     }
>>     public void setStoryBehindName(String storyBehindName) {
>>         this.storyBehindName = storyBehindName;
>>     }
>>     public void setUser(User user) {
>>         this.user = user;
>>     }
>>     
>>     /**
>>      * @see java.lang.Object#equals(Object)
>>      */
>>     public boolean equals(Object object) {
>>         if (!(object instanceof Nickname)) {
>>             return false;
>>         }
>>         Nickname rhs = (Nickname) object;
>>         return new EqualsBuilder().append(
>>              this.user, rhs.user).append(this.storyBehindName,
>>              rhs.storyBehindName).append(this.name, rhs.name).append(
>>              this.id, rhs.id).isEquals();
>>     }
>>     /**
>>      * @see java.lang.Object#hashCode()
>>      */
>>     public int hashCode() {
>>         return new HashCodeBuilder(-288934289,
>> 311543415).append(this.user)
>>              .append(this.storyBehindName).append(this.name).append(this.id)
>>              .toHashCode();
>>     }
>>     /**
>>      * @see java.lang.Object#toString()
>>      */
>>     public String toString() {
>>         return new ToStringBuilder(this).append("name",
>> this.name).append(
>>              "storyBehindName", this.storyBehindName).append("id", this.id)
>>              .append("user", this.user).toString();
>>     }
>>     
>>     
>>
>>     
>>
>> }
>>   
>> ------------------------------------------------------------------------
>>
>> package org.appfuse.dao;
>>
>> import org.appfuse.Constants;
>> import org.appfuse.model.Address;
>> import org.appfuse.model.Nickname;
>> import org.appfuse.model.Role;
>> import org.appfuse.model.User;
>> import org.springframework.dao.DataAccessException;
>> import org.springframework.dao.DataIntegrityViolationException;
>>
>> public class UserNicknameDaoTest extends BaseDaoTestCase {
>>     private UserDao dao = null;
>>     
>>     public void setUserDao(UserDao dao) {
>>         this.dao = dao;
>>     }
>>
>>     public void testGetUserInvalid() throws Exception {
>>         try {
>>             dao.get(1000L);
>>             fail("'badusername' found in database, failing test...");
>>         } catch (DataAccessException d) {
>>             assertTrue(d != null);
>>         }
>>     }
>>
>>     public void testGetUser() throws Exception {
>>         User user = dao.get(1L);
>>
>>         assertNotNull(user);
>>         assertEquals(1, user.getRoles().size());        
>>         assertTrue(user.isEnabled());
>>         
>>         super.assertEquals(3, user.getNickNames().size());
>>         for (Nickname n : user.getNickNames()) {
>>             System.out.println("The story behind '" + n.getName() + "' is
>> : '"  + n.getStoryBehindName() + "'");
>>         }
>>     }
>> }
>>   
> 
> 

-- 
View this message in context: 
http://www.nabble.com/apfuse2%2Bhibernate---GenericDaoHibernate-getAll-returns-duplicate-entities-%28users%29-tf3227657s2369.html#a8982981
Sent from the AppFuse - User mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to