Hi,
i have a problem when I try to make a class @Audited when this class have an @EmbeddedId (only when the Embeddable class have ManyToOne relationship).
Code:
persistence.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="TestAuditPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.connection.url" value="jdbc:mysql://192.168.0.6:3306/idm"/>
<property name="hibernate.ejb.event.post-insert"
value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update"
value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete"
value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update"
value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove"
value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate"
value="org.hibernate.envers.event.AuditEventListener" />
</properties>
</persistence-unit>
</persistence>
Class A:
Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package testaudit;
import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.envers.Audited;
/**
*
* @author heir
*/
@Entity
@Table(name="tblA")
@Audited
public class A implements Serializable {
@Id
private String name;
@OneToMany(mappedBy="bpk.a")
private java.util.List<B> bs;
public A()
{
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the bs
*/
public java.util.List<B> getBs() {
return bs;
}
/**
* @param bs the bs to set
*/
public void setBs(java.util.List<B> bs) {
this.bs = bs;
}
}
Class B:
Code:
@Entity
@Table(name="tblB")
@Audited
public class B implements Serializable {
@Id
private BPK bpk;
public B()
{
}
/**
* @return the bpk
*/
public BPK getBpk() {
return bpk;
}
/**
* @param bpk the bpk to set
*/
public void setBpk(BPK bpk) {
this.bpk = bpk;
}
}
Class BPK:
Code:
@Embeddable
public class BPK implements Serializable {
private String name;
@ManyToOne(targetEntity=testaudit.A.class,
cascade={CascadeType.ALL})
@JoinColumn(name="strAName")
private A a;
public BPK()
{
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the a
*/
public A getA() {
return a;
}
/**
* @param a the a to set
*/
public void setA(A a) {
this.a = a;
}
}
Main:
Code:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
EntityManagerFactory hemf = Persistence.createEntityManagerFactory("TestAuditPU");
SessionFactory sessionFactory = getSessionFactory(hemf);
//sessionFactory.openSession();
}
private static SessionFactory getSessionFactory(EntityManagerFactory hemf) {
return ((org.hibernate.ejb.HibernateEntityManagerFactory)hemf).getSessionFactory();
}
}
Exception:
Code:
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: TestAuditPU] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at testaudit.Main.main(Main.java:23)
Caused by: org.hibernate.HibernateException: could not init listeners
at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:205)
at org.hibernate.cfg.Configuration.getInitializedEventListeners(Configuration.java:1396)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:891)
... 4 more
Caused by: org.hibernate.MappingException: Type not supported: org.hibernate.type.ManyToOneType
at org.hibernate.envers.configuration.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:75)
at org.hibernate.envers.configuration.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:120)
at org.hibernate.envers.configuration.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:374)
at org.hibernate.envers.configuration.EntitiesConfigurator.configure(EntitiesConfigurator.java:100)
at org.hibernate.envers.configuration.AuditConfiguration.<init>(AuditConfiguration.java:86)
at org.hibernate.envers.configuration.AuditConfiguration.getFor(AuditConfiguration.java:99)
at org.hibernate.envers.event.AuditEventListener.initialize(AuditEventListener.java:334)
at org.hibernate.event.EventListeners$1.processListener(EventListeners.java:198)
at org.hibernate.event.EventListeners.processListeners(EventListeners.java:181)
at org.hibernate.event.EventListeners.initializeListeners(EventListeners.java:194)
... 8 more
Java Result: 1
It's possible to make a class with a EmbeddedId (with ManyToOne relationship) a audited class?
Thanks
Heinen Rino