hardy.ferentschik wrote:
Hi,
could you maybe provide a little more information, for example how all involved classes are annotated? Also what is the full stack trace of the exception?
Are you working against a legacy database or what else is the reason to make the discriminator column part of the primary key?
--Hardy
Yes, legacy DB.
The PK is like:
cdOwner int,
idObject int,
cdObjectType char(4)
We want the possibility of having two keys like 1, 1, ABCD and 1, 1, ZWXY.
Same Owner, same id but different Type (so 2 different object).
Code:
@Entity
@Table(name = "MyEntityTable")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="cdObjectType", discriminatorType=DiscriminatorType.STRING, length = 4)
public abstract class MyEntity implements Serializable {
@EmbeddedId
@AttributeOverride(name = "cdObjectType", column = @Column(name = "cdObjectType", nullable = false, insertable = false, updatable = false))
public MyEntityPK myEntityPK;
...
Code:
@Embeddable
public class MyEntityPK implements Serializable {
//@org.hibernate.validator.Min(value=1)
//@org.hibernate.validator.NotNull
@Column(name = "cdOwner", nullable = false)
private Integer cdOwner;
//@org.hibernate.validator.Min(value=1)
//@org.hibernate.validator.NotNull
@Column(name = "idObject", nullable = false)
private Integer idObject;
//@org.hibernate.validator.Length(min=4, max=4)
//@org.hibernate.validator.NotNull
@Column(name="cdTkObjectType", length=4, nullable=false)
private String cdTkObjectType;
...
Code:
@Entity
@DiscriminatorValue("CARS")
@SecondaryTable(
name="MySecondaryTable",
pkJoinColumns={
@PrimaryKeyJoinColumn(name="cdOwner", referencedColumnName="cdOwner"),
@PrimaryKeyJoinColumn(name="idObject", referencedColumnName="idObject"),
@PrimaryKeyJoinColumn(name="cdObjectType", referencedColumnName="cdObjectType")
}
)
public class Cars extends MyEntity implements Serializable {
private static final long serialVersionUID = 1L;
//@org.hibernate.validator.NotNull
@Column(name = "dhSold", table="MySecondaryTable", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date dhSold;
...
Error:
Code:
javax.persistence.PersistenceException: [PersistenceUnit: MyPU] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
at it.myproject.StartUpClass.<init>(StartUpClass.java:146)
at it.myproject.StartUpClass.main(StartUpClass.java:1401)
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: it.myproject.entities.Cars column: cdObjectType (should be mapped with insert="false" update="false")
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:647)
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:690)
at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:445)
at org.hibernate.mapping.SingleTableSubclass.validate(SingleTableSubclass.java:43)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1112)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1297)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:854)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
... 4 common frames omitted
Regards