wood burning stoves*
The moose likes Object Relational Mapping and the fly likes Question about @SecondaryTable Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Databases » Object Relational Mapping
Bookmark "Question about @SecondaryTable" Watch "Question about @SecondaryTable" New topic
Author

Question about @SecondaryTable

Laura Barroso
Ranch Hand

Joined: Sep 21, 2009
Posts: 30
Hi, I'm trying to use the @SecondaryTable in my app, however, when I try to deploy it this exception arise:
rg.hibernate.AnnotationException: Cannot find the expected secondary table: no animal_state available for test.Animal
at org.hibernate.cfg.Ejb3Column.getJoin(Ejb3Column.java:293)
at org.hibernate.cfg.Ejb3Column.getTable(Ejb3Column.java:272)

at org.hibernate.cfg.annotations.SimpleValueBinder.make(SimpleValueBinder.java:222)
at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:122)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1667)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)

Here is my code:
@Entity
@Table(name="animals")
@Inheritance(strategy=InheritanceType.JOINED)
@SecondaryTable(name = "animal_states",
pkJoinColumns={
@PrimaryKeyJoinColumn(name="animal_id")})
public class Animal extends EntityBean<Integer> implements Serializable {

protected String name;


@Id
@Column(name="animal_id")
public int getAnimalId() {
return this.beanId.intValue();
}

public void setAnimalId(int id) {
this.beanId = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}



@Transient
public String getEntityKey() {
return new Integer(this.beanId).toString();
}

@Transient
public String getDisplayValue() {
return "Animal";
}

protected int temperature;
@Column(name="temperature", table = "animal_state")
public int getTemperature() {
return temperature;
}

public void setTemperature(int temperature) {
this.temperature = temperature;
}

}

Mark E Hansen
Ranch Hand

Joined: Apr 01, 2009
Posts: 643
In some places you use "animal_state" while others you use "animal_states"?
Laura Barroso
Ranch Hand

Joined: Sep 21, 2009
Posts: 30
Well Mark, you were rigth...the problem was that I didn't put the name of the table rigth...however when I add another class that inherit from Animal I get this exception :
ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=#DataServicePU state=Create
org.hibernate.AssertionFailure: Table animal_state not found

And here is my code:
@Entity
@Table(name="animals")
@Inheritance(strategy=InheritanceType.JOINED)
@SecondaryTable(name = "animal_state",
pkJoinColumns={ @PrimaryKeyJoinColumn(name="animal_id")})
public class Animal extends EntityBean<Integer> {

protected String name;
protected Integer temperature;
public Animal()
{}

@Id
@Column(name="animal_id")
public int getAnimalId() {
return this.beanId.intValue();
}

public void setAnimalId(int id) {
this.beanId = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}



@Transient
public String getEntityKey() {
return new Integer(this.beanId).toString();
}

@Transient
public String getDisplayValue() {
return "Animal";
}


@Column(name="temperature", table = "animal_state",nullable=true)
public int getTemperature() {
return temperature;
}

public void setTemperature(int temperature) {
this.temperature = temperature;
}

}


@Entity
@Table(name="dogs")
@SecondaryTable(name="dog_states",
pkJoinColumns={@PrimaryKeyJoinColumn(name="animal_id")})
public class Dog extends Animal {

private String collarColor;
private String animo;
public Dog() {

}

public String getCollarColor() {
return collarColor;
}

public void setCollarColor(String collarColor) {
this.collarColor = collarColor;
}

/*@Override
@OneToOne
@PrimaryKeyJoinColumn(name="animal_id",referencedColumnName="animal_id")
public DogState getActualState() {
return (DogState) super.getActualState();
}*/


@Column(name = "animo", table="dog_states",nullable=true)
public String getAnimo() {
return animo;
}

public void setAnimo(String animo) {
this.animo = animo;
}

}



Szczepan Kuzniarz
Greenhorn

Joined: Feb 19, 2010
Posts: 1
It is a bug in Hibernate :-( It is impossible to use both inheritance of type JOINED and secondary tables... Have a look at http://opensource.atlassian.com/projects/hibernate/browse/HHH-4240.
Prateek Kumar Singh
Greenhorn

Joined: Jan 21, 2011
Posts: 29

Hi,

In JPA just change the name of entity class , and check no other table exist in database with same name of your Entity class. make table name and Entity class/classes name different.

it will definitely solve your problem.

Prateek Singh
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Question about @SecondaryTable
 
Similar Threads
How to get user name
Replacing *.hbm.xml files with @Annotations.
@MappedSuperclass and @SecondaryTable Causing Exception In JBoss 5.1
result display error
Hibernate: Problem with @SecondaryTable annotation