[jbossseam-issues] [JBoss JIRA] Commented: (JBSEAM-994) seam-gen and mutiple foreign keys

Pierre Raoul (JIRA) jira-events at lists.jboss.org
Mon Jun 4 04:06:18 EDT 2007


    [ http://jira.jboss.com/jira/browse/JBSEAM-994?page=comments#action_12364055 ] 
            
Pierre Raoul commented on JBSEAM-994:
-------------------------------------

Herewith a patch which addresses two issues:
- to deal with an entity which has two or more attributes with the same entity as type, i.e. the above multiple foreign keys issue
- to be able to come back on the calling page, for example after adding/editing an entity attribute or showing detail of an item in a list attribute.

It works with jpaconfiguration (see JBSEAM 843). There is a new target (seam generate-ui) to create the ui from entities.
It can be run as often as wished.

I only tested it from entity pojos and for ear projects in dev mode. 
I didn't try reverse engineering from data bases.

About the second issue (links between crud pages): I tested only one level of deepth between linked entities. I don't know if it will work fine with entity attributes in cascade.

The patch is generated against today cvs.

I used some new materials:
- javassist for hibernate tools
- xmltask to merge fine-grained configuration files
- tomahawk as I use "t:buffer" tag to manage with complex expression
  in xhtml files
  (yes I know, it's quite a heavy tool just for that, but it's the only 
  one I found ready to be used...)
  tomahawk needs commons-fileupload.jar
- log4j to avoid some error messages from hibernate during "generated-ui"

Two secondary issues:
- I didn't find how to avoid putting "hibernate.dialect" 
  in persistence-dev.xml
- With the current "seam.bat" under Windows, there is no way to work with
  the right hibernate annotations and entitymanager libraries.
  Ant is called with {seam_home}/lib in both "ant.home" and "ant.library.dir".
  As:
  * hibernate-all.jar is in {seam_home}/lib,
  * and HAN and HEM are in hibernate-all.jar,
  the libraries in {seam_home}/hibernate/lib are never loaded.
  But the HAN and HEM classes in hibernate-all.jar are too old:
  version 3.2.0.CR3 or above is needed.
  
  As turnaround, I use a new directory {seam_home}/ant/lib with 
  only ant.jar and I put it in "ant.home" and "ant.library.dir" 
  during "generated-ui".


> seam-gen and mutiple foreign keys
> ---------------------------------
>
>                 Key: JBSEAM-994
>                 URL: http://jira.jboss.com/jira/browse/JBSEAM-994
>             Project: JBoss Seam
>          Issue Type: Bug
>          Components: Tools
>    Affects Versions: 1.2.0.GA
>         Environment: JBoss-4.0.5
>            Reporter: Niels Hoogeveen
>         Attachments: EntityHome.java.ftl.patch
>
>
> I have generated a project with seam-gen based on generate-entities. All works fine, except for the generation of the home interfaces. In one of my tables I have two foreign keys to the same table. In the home interface two references are created to the appropriate object, but with the same name (which of course doesn't compile). 
> Here is a simplified example: 
> Table 1 
> Code: 
> CREATE TABLE test
> (
>   id int4 NOT NULL DEFAULT nextval('test_id_seq'::regclass),
>   name varchar,
>   id_test2_1 int4,
>   id_test2_2 int4,
>   CONSTRAINT test_pkey PRIMARY KEY (id),
>   CONSTRAINT test_id_test2_1_fkey FOREIGN KEY (id_test2_1)
>       REFERENCES test2 (id) MATCH SIMPLE
>       ON UPDATE NO ACTION ON DELETE NO ACTION,
>   CONSTRAINT test_id_test2_2_fkey FOREIGN KEY (id_test2_2)
>       REFERENCES test2 (id) MATCH SIMPLE
>       ON UPDATE NO ACTION ON DELETE NO ACTION
> ) 
> 	 
> Table2 
> Code: 
> CREATE TABLE test2
> (
>   id int4 NOT NULL DEFAULT nextval('test2_id_seq'::regclass),
>   name varchar,
>   CONSTRAINT test2_pkey PRIMARY KEY (id)
> ) 
> 	 
> First Entity 
> Code: 
> @Entity
> @Table(name = "test", schema = "public")
> public class Test implements java.io.Serializable {
> 	private int id;
> 	private Test2 test2ByIdTest22;
> 	private Test2 test2ByIdTest21;
> 	private String name;
> 	public Test() {
> 	}
> 	public Test(int id) {
> 		this.id = id;
> 	}
> 	public Test(int id, Test2 test2ByIdTest22, Test2 test2ByIdTest21,
> 			String name) {
> 		this.id = id;
> 		this.test2ByIdTest22 = test2ByIdTest22;
> 		this.test2ByIdTest21 = test2ByIdTest21;
> 		this.name = name;
> 	}
> 	@Id
> 	@Column(name = "id", unique = true, nullable = false)
> 	@NotNull
> 	public int getId() {
> 		return this.id;
> 	}
> 	public void setId(int id) {
> 		this.id = id;
> 	}
> 	@ManyToOne(fetch = FetchType.LAZY)
> 	@JoinColumn(name = "id_test2_2")
> 	public Test2 getTest2ByIdTest22() {
> 		return this.test2ByIdTest22;
> 	}
> 	public void setTest2ByIdTest22(Test2 test2ByIdTest22) {
> 		this.test2ByIdTest22 = test2ByIdTest22;
> 	}
> 	@ManyToOne(fetch = FetchType.LAZY)
> 	@JoinColumn(name = "id_test2_1")
> 	public Test2 getTest2ByIdTest21() {
> 		return this.test2ByIdTest21;
> 	}
> 	public void setTest2ByIdTest21(Test2 test2ByIdTest21) {
> 		this.test2ByIdTest21 = test2ByIdTest21;
> 	}
> 	@Column(name = "name", length = 0)
> 	@Length(max = 0)
> 	public String getName() {
> 		return this.name;
> 	}
> 	public void setName(String name) {
> 		this.name = name;
> 	}
> }
> 	 
> second entity 
> Code: 
> @Entity
> @Table(name = "test2", schema = "public")
> public class Test2 implements java.io.Serializable {
> 	private int id;
> 	private String name;
> 	private Set<Test> testsForIdTest21 = new HashSet<Test>(0);
> 	private Set<Test> testsForIdTest22 = new HashSet<Test>(0);
> 	public Test2() {
> 	}
> 	public Test2(int id) {
> 		this.id = id;
> 	}
> 	public Test2(int id, String name, Set<Test> testsForIdTest21,
> 			Set<Test> testsForIdTest22) {
> 		this.id = id;
> 		this.name = name;
> 		this.testsForIdTest21 = testsForIdTest21;
> 		this.testsForIdTest22 = testsForIdTest22;
> 	}
> 	@Id
> 	@Column(name = "id", unique = true, nullable = false)
> 	@NotNull
> 	public int getId() {
> 		return this.id;
> 	}
> 	public void setId(int id) {
> 		this.id = id;
> 	}
> 	@Column(name = "name", length = 0)
> 	@Length(max = 0)
> 	public String getName() {
> 		return this.name;
> 	}
> 	public void setName(String name) {
> 		this.name = name;
> 	}
> 	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "test2ByIdTest21")
> 	public Set<Test> getTestsForIdTest21() {
> 		return this.testsForIdTest21;
> 	}
> 	public void setTestsForIdTest21(Set<Test> testsForIdTest21) {
> 		this.testsForIdTest21 = testsForIdTest21;
> 	}
> 	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "test2ByIdTest22")
> 	public Set<Test> getTestsForIdTest22() {
> 		return this.testsForIdTest22;
> 	}
> 	public void setTestsForIdTest22(Set<Test> testsForIdTest22) {
> 		this.testsForIdTest22 = testsForIdTest22;
> 	}
> }
> 	 
> Home interface of first entity. Here we have two Test2Home references, both with the name test2Home. 
> Code: 
> @Name("testHome")
> public class TestHome extends EntityHome<Test> {
> 	@In(create = true)
> 	Test2Home test2Home;
> 	@In(create = true)
> 	Test2Home test2Home;
> 	public void setTestId(Integer id) {
> 		setId(id);
> 	}
> 	public Integer getTestId() {
> 		return (Integer) getId();
> 	}
> 	@Override
> 	protected Test createInstance() {
> 		Test test = new Test();
> 		return test;
> 	}
> 	public void wire() {
> 		Test2 test2ByIdTest22 = test2Home.getDefinedInstance();
> 		if (test2ByIdTest22 != null) {
> 			getInstance().setTest2ByIdTest22(test2ByIdTest22);
> 		}
> 		Test2 test2ByIdTest21 = test2Home.getDefinedInstance();
> 		if (test2ByIdTest21 != null) {
> 			getInstance().setTest2ByIdTest21(test2ByIdTest21);
> 		}
> 	}
> 	public boolean isWired() {
> 		return true;
> 	}
> 	public Test getDefinedInstance() {
> 		return isIdDefined() ? getInstance() : null;
> 	}
> }
> 	 
> BTW. I used the latest seam version from CVS.

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

        



More information about the seam-issues mailing list