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]