Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Specifying a sequence as the pk generator for a many-to-many-join table relationship

You cannot put a @GeneratedValue on a @ManyToMany.

Generally if you have additional fields in a join table you need to create
an object that maps to the join table to map the fields.
See,
http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany#Mapping_a_Join_Table_with_Additional_Columns

You can also use a database trigger to auto generate the value, or use
custom SQL in your EclipseLink ManyToManyMapping (setInsertSQLString()) from
a DescriptorCustomizer.



Mike Kienenberger wrote:
> 
> We have a many-to-many relationship between Receipt and CashBatch.
> 
> We have a cash_batch_receipt join table with:
>   - id NUMERIC (primary key)
>   - cash_batch_id NUMERIC (foreign key to cash_batch)
>   - receipt_id NUMERIC (foreign key to cash_batch)
> 
> and a SeqCashBatchReceiptJoin for generating pk values.
> 
> How can we map this so that the sequence is used to generate the ID pk
> value?
> 
> The following did not work.
> 
> 
> [In JpaCashBatch...]
> 
>    @ManyToMany(targetEntity=JpaReceipt.class,
> mappedBy="cashBatchList", fetch=FetchType.LAZY)
>     @GeneratedValue(strategy=GenerationType.SEQUENCE,
> generator="SeqCashBatchReceiptJoin")
>     @JoinTable (
>         name="cash_batch_receipt_join",
>         joinColumns=@JoinColumn(name="cash_batch_id",
> referencedColumnName="id"),
>         inverseJoinColumns=@JoinColumn(name="receipt_id",
> referencedColumnName="id")
>     )
> 
> 
> [In JpaReceipt...]
> 
>     @ManyToMany(targetEntity=JpaCashBatch.class, fetch=FetchType.LAZY)
>     @GeneratedValue(strategy=GenerationType.SEQUENCE,
> generator="SeqCashBatchReceiptJoin")
>     @JoinTable (
>         name="cash_batch_receipt_join",
>         joinColumns=@JoinColumn(name="receipt_id",
> referencedColumnName="id"),
>         inverseJoinColumns=@JoinColumn(name="cash_batch_id",
> referencedColumnName="id")
>     )
>     private List<CashBatchEntity> cashBatchList = null;
> 
> 
> We get:
> 
> java.sql.SQLException: ORA-01400: cannot insert NULL into
> ("CIS"."CASH_BATCH_RECEIPT_JOIN"."ID")
> 
> Error Code: 1400 Call: INSERT INTO cash_batch_receipt_join
> (cash_batch_id, receipt_id) VALUES (?, ?) bind => [1002, 1191] Query:
> DataModifyQuery(sql="INSERT INTO cash_batch_receipt_join
> (cash_batch_id, receipt_id) VALUES (?, ?)")
> 
> Thanks!   I couldn't find any information on many-to-many JPA mappings
> for tables with independent primary keys.
> 
> Regards,
> Mike
> 


-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://www.nabble.com/Specifying-a-sequence-as-the-pk-generator-for-a-many-to-many-join-table-relationship-tp25286091p25384004.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top