Bonjour !
Je suis débutant sur la technologie Hibernate et je n'arrive pas a trouver de réponse a ce problème bien précis dans les différents forums et tutoriaux donc je me permets d'en créer un nouveau.
(Copie du post posté aussi sur le forum hibernate a cette adresse : https://forum.hibernate.org/viewtopi...f=11&t=1000712
Voici ce que je voudrais obtenir comme tables avec mon code : 

J'ai donc crée les classes comme suit (je vous fait abstraction des getters et setters qui ne possèdent aucunes annotations : 
Classe A
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
   |  
@Entity
@Table( name = "TABLE_A")
public class A implements Serializable
{
 
    /** Auto generated id of the table. */
    @Id
    @SequenceGenerator( name = "SEQ_ID_A_GEN", sequenceName = "SEQ_ID_A", initialValue = 1, allocationSize = 1 )
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "SEQ_ID_A_GEN" )
    @Column( name = "ID_A", nullable = false )
    private Integer                       idA;
 
    /**     */
    @Column( name = "NAME_A")
    private String                        name;
 
    /**     */
    @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "pkB.objectA" )
    private List<B>            listOfB           = new ArrayList<B>();
 
    /**     */
    @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "pkD.objectA" )
    private List<D>            listOfD           = new ArrayList<D>();
 
    /**     */
    @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "pkE.objectA" )
    private List<E>            listOfE           = new ArrayList<E>();
 
 
    /**
     * Constructor without parameters.
     */
    public A()
    {
    }
 
   ...
} | 
 Classe B : 
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   |  
@Entity
@Table( name = "TABLE_B" )
@AssociationOverrides( { @AssociationOverride( name = "pkB.objectA", joinColumns = @JoinColumn( name = "ID_A" ) ) } )
public class B implements Serializable
{
    /** Multiple Identity for this table. */
    @EmbeddedId
    private BPrimaryKey pkB = new BPrimaryKey();
 
    /**     */
    @Column( name = "NAME_B" )
    private String      name;
 
    /**     */
    @OneToMany( fetch = FetchType.LAZY, mappedBy = "pkC.objectB" )
    private List<C>     listOfC = new ArrayList<C>();
 
    /**
     * Constructor without parameters.
     */
    public B()
    {
    }
 
 
 
    //------------------------------------------------------------------------------
    // ---
    // --- Class name:  BPrimaryKey
    // --- Creation:    2 nov. 2009
    /**
     * <p>Title : BPrimaryKey </p>
     * <p>Description : <p> 
     */
    // ---
    //------------------------------------------------------------------------------
    @Embeddable
    public static class BPrimaryKey implements Serializable
    {
 
        /**     */
        @ManyToOne( fetch = FetchType.LAZY )
        private A       objectA;
 
        /** Number of the sequence. */
        @Column( name = "ID_B" )
        private Integer idB;
 
        /**
         * Constructor without parameters.
         */
        public BPrimaryKey()
        {
        }
 
   }
} | 
 Les Classe D et E sont identiques à la classe B (mis a part la liste de C)
et Classe C : 
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
   |  
@Entity
@Table( name = "TABLE_C" )
@AssociationOverrides( { @AssociationOverride( name = "pkC.objectB", joinColumns = {
                                                                                    @JoinColumn( name = "ID_A" ),
                                                                                    @JoinColumn( name = "ID_B" ) } ) } )
public class C implements Serializable
{
    /** Multiple Identity for this table. */
    @EmbeddedId
    private CPrimaryKey pkC = new CPrimaryKey();
 
    /**     */
    @Column( name = "NAME_C" )
    private String      name;
 
    /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A" ),
            @JoinColumn( name = "NUM_D", referencedColumnName = "ID_D" ) } )
    private D           numD;
 
    /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A" ),
            @JoinColumn( name = "NUM_E", referencedColumnName = "ID_E" ) } )
    private E           numE;
 
    /**
     * Constructor without parameters.
     */
    public C()
    {
    }
 
 
 
 
    @Embeddable
    public static class CPrimaryKey implements Serializable
    {
 
        /**     */
        @ManyToOne( fetch = FetchType.LAZY )
        private B       objectB;
 
        /** Number of the sequence. */
        @Column( name = "ID_C" )
        private Integer idC;
 
        /**
         * Constructor without parameters.
         */
        public CPrimaryKey()
        {
        }
 
 
    }
 
} | 
 Code JUNIT de test : 
	
	1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
   | /**
 * 
 */
 
public class TestBase
{
 
    private static EntityManager        em;
 
    private static EntityManagerFactory emf;
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception
    {
 
        emf = Persistence.createEntityManagerFactory( "sample" );
 
    }
 
    @AfterClass
    public static void tearDownAfterClass() throws Exception
    {
 
        emf.close();
 
    }
 
    @Before
    public void setUp() throws Exception
    {
 
        em = emf.createEntityManager();
 
    }
 
    @After
    public void tearDown() throws Exception
    {
 
        em.close();
 
    }
 
    @Test
    public void testRemplissage()
    {
        EntityTransaction tx = em.getTransaction();
 
        tx.begin();
 
        A objA = new A();
 
        objA.setName("New Object A");
 
        em.persist( objA );
 
 
        B objB = new B();
 
        objB.setName( "New Object B" );
        objB.setObjectA( objA );
 
        //objB.getPkB().setIdA( objA.getIdA() );
        objB.getPkB().setIdB( 1 );
 
        objA.getListOfB().add( objB );
 
        em.persist( objB );
 
 
        D objD = new D();
 
        objD.setName( "New Object D" );
        objD.setObjectA( objA );
 
        objD.getPkD().setIdD( 1 );
 
        objA.getListOfD().add( objD );
 
        em.persist( objD );
 
 
        E objE = new E();
 
        objE.setName( "New Object E" );
        objE.setObjectA( objA );
 
        objE.getPkE().setIdE( 1 );
 
        objA.getListOfE().add( objE );
 
        em.persist( objE );
 
 
        C objC = new C();
 
        objC.setName( "New Object C" );
        objC.setObjectB( objB );
 
        objC.setNumD( objD );
        objC.setNumE( objE );
 
        objC.getPkC().setIdC( 1 );
 
        objB.getListOfC().add( objC );
 
        em.persist( objC );
 
 
        tx.commit();
    }
 
} | 
 Le problème avec ce code c'est que j'obtiens une exception :
	
	Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: forum.C column: ID_A (should be mapped with insert="false" update="false")
 Pour supprimer cette exception j'ai donc modifier comme suit : 
	
	1 2 3 4 5 6 7 8 9 10 11 12 13
   | /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A", insertable = false, updatable = false ),
            @JoinColumn( name = "NUM_D", referencedColumnName = "ID_D" ) } )
    private D           numD;
 
    /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A", insertable = false, updatable = false ),
            @JoinColumn( name = "NUM_E", referencedColumnName = "ID_E" ) } )
    private E           numE; | 
 Mais là j'obtiens :
	
	Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: forum.CnumD
 Donc je remodifie comme ca : 
	
	1 2 3 4 5 6 7 8 9 10 11 12 13
   | /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A", insertable = false, updatable = false ),
            @JoinColumn( name = "NUM_D", referencedColumnName = "ID_D", insertable = false, updatable = false ) } )
    private D           numD;
 
    /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A", referencedColumnName = "ID_A", insertable = false, updatable = false ),
            @JoinColumn( name = "NUM_E", referencedColumnName = "ID_E", insertable = false, updatable = false ) } )
    private E           numE; | 
 Mon code marche, je n'ai bien qu'un seul ID_A mais je n'ai pas ce que je veux car je n'obtiens pas mon NUM_D ni mon NUM_E comme j'ai insertable et updatable a false.
Pour les obtenir je suis obligé de faire :
	
	1 2 3 4 5 6 7 8 9 10 11 12 13
   | /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A_D", referencedColumnName = "ID_A" ),
            @JoinColumn( name = "NUM_D", referencedColumnName = "ID_D" ) } )
    private D           numD;
 
    /**  */
    @OneToOne( cascade = CascadeType.ALL )
    @JoinColumns( {
            @JoinColumn( name = "ID_A_E", referencedColumnName = "ID_A" ),
            @JoinColumn( name = "NUM_E", referencedColumnName = "ID_E" ) } )
    private E           numE; | 
 Et voici ce que j'obtiens avec ce code :

Comment faire pour récupérer mes numéros D et E ? ou comment faire comprendre a hibernate que mes 3 ID_A sont les mêmes comme sur le premier schéma ? 
Merci
PS : Vous pouvez trouver un zip complet du projet eclipse a cette adresse : http://dl.free.fr/qIcCi23eL
						
					
Partager