wood burning stoves 2.0
The moose likes Object Relational Mapping and the fly likes @PrimaryKeyJoinColumn: no insertable and no updatable Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Databases » Object Relational Mapping
Bookmark "@PrimaryKeyJoinColumn: no insertable and no updatable" Watch "@PrimaryKeyJoinColumn: no insertable and no updatable" New topic

@PrimaryKeyJoinColumn: no insertable and no updatable

Karsten Wutzke
Ranch Hand

Joined: Jul 20, 2010
Posts: 106


why doesn't @PrimaryKeyJoinColumn/s have insertable = x and updatable = x ?

This would imply that if there are any properties to be flagged as "not insertable" and/or "not updatable" should go to the (column) properties marked with @Column rather than the conflicting associations tagged with @JoinColumn/s, right? The question is basically: where do the insertable and/or updatable best go to, the associations or the respective column properties?


OCJP JavaSE 6 (86%)
James Sutherland
Ranch Hand

Joined: Oct 01, 2007
Posts: 553
Basically because a PrimaryKeyJoinColumn is always read-only (insertable/updateable=false). It only purpose is to be used when the primary key is mapped using a basic attribute. The basic attribute is responsible for mapping it.


In JPA 2.0 you don't need the basic, so can just use the JoinColumn with an @Id on it.
If you want both, and want the OneToOne writable, then use a JoinColumn and make the Id's column insertable/updateable=false.

TopLink : EclipseLink : Book:Java Persistence : Blog:Java Persistence Performance
Karsten Wutzke
Ranch Hand

Joined: Jul 20, 2010
Posts: 106

(I've already read the wikibooks article a thousand times.)

OK, this is what I suspected. Your statement "@PrimaryKeyJoinColumn is always read-only" makes perfect sense to me. However, I have the following mapping which gives me headaches with your answer. (I'm in a JPA 1.0 environment (JavaEE 5) with Hibernate 3.5.4)

Table first:

As you can see there's a composite PK on the table with game_id being an FK column to Games.id. is_home is a simple PK column which goes into the PK class. That's about it. Here's the (generated) JPA 1.0 code:

Composite PK class using @EmbeddedId:

Hibernate 3.5.4 produces a stack trace on calling Persistence.createEntityManagerFactory("bbstats"):

Hibernate is complaining about game_id not being insertable=false and updatable=false. According to your statement and my suspicion the @PrimaryKeyJoinColumn should do just that. Note, that I put the insertable = false, updatable = false on the ID class' game_id property, because when using an @IdClass implementation instead of @EmbeddedId "insertable = false, updatable = false" is put into the redundant column's @Id annotation, too. (it might be wrong to do so)

I was able to get rid of the Hibernate exception by using

@PrimaryKeyJoinColumn(name = "game_id", referencedColumnName = "id", insertable = false, updatable = false)
private Game game = null;

to give:

This however means one of two things:

1. Your statement and my suspicion are wrong.
2. Hibernate has an issue correctly interpreting @PrimaryKeyJoinColumn

It raises the question for me, as I'm trying to create JPA 1.0 code to be used with Hibernate, if Hibernate 3.x can be used in a JPA 1.0 environment at all.

See: http://www.coderanch.com/t/509568/ORM/java/Hibernate-JPA

For me, it's a mystery why

@PrimaryKeyJoinColumn(name = "game_id", referencedColumnName = "id")
@JoinColumn(name = "game_id", referencedColumnName = "id", insertable = false, updatable = false)

aren't the same in Hibernate 3.5 and/or 3.6 (assuming JPA 1.0, which doesn't allow adding @Id to @XToX associations)...


I agree. Here's the link: http://aspose.com/file-tools
subject: @PrimaryKeyJoinColumn: no insertable and no updatable
It's not a secret anymore!